C語言檔案操作函數大全(超詳細)
fopen(開啟檔案)
相關函數 open,fclose
表頭文件
#include
定義函數 FILE * fopen(const char * path,const char *
mode);
函數說明
參數path字串包含欲開啟的檔案路徑及檔名,參數mode字串則代表著流形態。
mode有下列幾種形態字串:
r
開啟唯讀文件,該文件必須存在。
r+ 開啟可讀寫的文件,該文件必須存在。
w
開啟只寫文件,若文件存在則文件長度清除為0,即該文件內容會消失。若文件不存在則建立該文件。
w+
開啟可讀寫文件,若文件存在則文件長度清除為零,即該文件內容會消失。若文件不存在則建立該文件。
a
以附加的方式開啟只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的資料會被加到文件尾,即文件原先的內容會被保留。
a+
以附加方式開啟可讀寫的檔案。若文件不存在,則會建立該文件,如果文件存在,寫入的資料會被加到文件尾後,即文件原先的內容會被保留。
r Open text file for reading. The stream is positioned at the beginning of the file. r+ Open for reading and writing. The stream is positioned at the beginning of the file. w Truncate file to zero length or create text file for writing. The stream is positioned at the beginning of the file. w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is posi‐ tioned at the beginning of the file. a Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file. a+ Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file posi‐ tion for reading is at the beginning of the file, but output is always appended to the end of the file.
上述的形態字串都可以再加一個b字符,如rb、w+b或ab+等組合,加入b
字元用來告訴函數庫開啟的文件為二進位文件,而非純文字文件。不過在POSIX系統,包含Linux都會忽略該字元。由fopen()所建立的新檔案會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)權限,此檔案權限也會參考umask值。
回傳值
文件順利打開後,指向該流的文件指標就會被回傳。若果檔案開啟失敗則回傳NULL,並且把錯誤代碼存在errno 中。
附加說明
一般而言,開檔後會作一些檔案讀取或寫入的動作,若開檔案失敗,接下來的讀寫動作也無法順利進行,所以在fopen()後請作錯誤判斷及處理。
範例
#include<stdio.h> main() { FILE * fp; fp=fopen(“noexist”,”a+”); if(fp= =NULL) return; fclose(fp); }
1.
fprintf
功能:傳送格式化輸出到一個檔案中
表頭檔:#include
函數原型:int
fprintf(FILE *stream, char *format[, argument,...]);
FILE*
一個FILE型的指標
char* 格式化輸入函數,和printf裡的格式一樣
回傳值:成功時回傳轉換的位元組數,失敗時回傳一個負數
fp =
fopen("/local/test.c","a+");
fprintf(fp,"%sn",str);
2.
fscanf
功能:從一個流執行格式化輸入
表頭檔:#include
函數原型:int
fscanf(FILE *stream, char *format[,argument...]);
FILE* 一個FILE型的指標
char*
格式化輸出函數,和scanf裡的格式一樣
回傳值:成功時回傳轉換的位元組數,失敗時回傳一個負數
fp =
fopen("/local/test.c","a+");
fscanf(fp,"%s",str);
3. clearerr(清除檔案流的錯誤旗標)
相關函數
feof
表頭檔 #include
定義函數 void clearerr(FILE *
stream);
函數說明
clearerr()清除參數stream指定的檔案流所使用的錯誤旗標。
回傳值
4.fclose(關閉檔案)
相關函數
close,fflush,fopen,setbuf
表頭檔 #include
定義函數 int
fclose(FILE * stream);
函數說明
fclose()用來關閉先前fopen()開啟的檔案。此動作會讓緩衝區內的資料寫入檔案中,並釋放系統所提供的檔案資源。
回傳值
若關文件動作成功則回傳0,有錯誤發生時則回傳EOF並把錯誤代碼存到errno。
錯誤代碼 EBADF表示參數stream非已開啟的檔案。
範例
請參考fopen()。
5.fdopen(將檔案描述詞轉為檔案指標)
相關函數
fopen,open,fclose
表頭檔 #include
定義函數 FILE * fdopen(int
fildes,const char * mode);
函數說明 fdopen()會將參數fildes
的文件描述詞,轉換為對應的文件指針後返回。參數mode 字串則代表著檔案指標的流形態,此形態必須和原先文件描述詞讀寫模式相同。關於mode
字串格式請參考fopen()。
回傳值 轉換成功時傳回指向該流的檔案指標。失敗則回傳NULL,並把錯誤代碼存在errno。
範例
#include<stdio.h> main() { FILE * fp =fdopen(0,”w+”); fprintf(fp,”%s/n”,”hello!”); fclose(fp); } 执行 hello!
6.feof(检查文件流是否读到了文件尾)
相关函数
fopen,fgetc,fgets,fread
表头文件 #include
定义函数 int feof(FILE *
stream);
函数说明
feof()用来侦测是否读取到了文件尾,尾数stream为fopen()所返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0。
返回值
返回非零值代表已到达文件尾。
7.fflush(更新缓冲区)
相关函数
write,fopen,fclose,setbuf
表头文件 #include
定义函数 int
fflush(FILE* stream);
函数说明
fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中。如果参数stream为NULL,fflush()会将所有打开的文件数据更新。
返回值
成功返回0,失败返回EOF,错误代码存于errno中。
错误代码 EBADF 参数stream
指定的文件未被打开,或打开状态为只读。其它错误代码参考write()。
8.fgetc(由文件中读取一个字符)
相关函数
open,fread,fscanf,getc
表头文件 include
定义函数 nt fgetc(FILE *
stream);
函数说明 fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。
返回值
getc()会返回读取到的字符,若返回EOF则表示到了文件尾。
范例
#include<stdio.h> main() { FILE *fp; int c; fp=fopen(“exist”,”r”); while((c=fgetc(fp))!=EOF) printf(“%c”,c); fclose(fp); }
9.fgets(由文件中读取一字符串)
相关函数
open,fread,fscanf,getc
表头文件 include
定义函数 har * fgets(char *
s,int size,FILE * stream);
函数说明
fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。
返回值
gets()若成功则返回s指针,返回NULL则表示有错误发生。
范例
#include<stdio.h> main() { char s[80]; fputs(fgets(s,80,stdin),stdout); } 执行 this is a test /*输入*/ this is a test /*输出*/
10.fileno(返回文件流所使用的文件描述词)
相关函数
open,fopen
表头文件 #include
定义函数 int fileno(FILE *
stream);
函数说明 fileno()用来取得参数stream指定的文件流所使用的文件描述词。
返回值
返回文件描述词。
范例
#include<stdio.h> main() { FILE * fp; int fd; fp=fopen(“/etc/passwd”,”r”); fd=fileno(fp); printf(“fd=%d/n”,fd); fclose(fp); } 执行 fd=3
12.fputc(将一指定字符写入文件流中)
相关函数
fopen,fwrite,fscanf,putc
表头文件 #include
定义函数 int fputc(int
c,FILE * stream);
函数说明 fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中。
返回值
fputc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。
范例
#include<stdio.h> main() { FILE * fp; char a[26]=”abcdefghijklmnopqrstuvwxyz”; int i; fp= fopen(“noexist”,”w”); for(i=0;i<26;i++) fputc(a,fp); fclose(fp); }
13.fputs(将一指定的字符串写入文件内)
相关函数
fopen,fwrite,fscanf,fputc,putc
表头文件 #include
定义函数 int
fputs(const char * s,FILE * stream);
函数说明
fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。
返回值
若成功则返回写出的字符个数,返回EOF则表示有错误发生。
范例
请参考fgets()。
fread(从文件流读取数据)
相关函数
fopen,fwrite,fseek,fscanf
表头文件 #include
定义函数 size_t
fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
函数说明
fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr
指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb
来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。
返回值
返回实际读取到的nmemb数目。
附加说明
范例
#include<stdio.h> #define nmemb 3 struct test { char name[20]; int size; }s[nmemb]; int main(){ FILE * stream; int i; stream = fopen(“/tmp/fwrite”,”r”); fread(s,sizeof(struct test),nmemb,stream); fclose(stream); for(i=0;i<nmemb;i++) printf(“name[%d]=%-20s:size[%d]=%d/n”,i,s.name,i,s.size); } 执行 name[0]=Linux! size[0]=6 name[1]=FreeBSD! size[1]=8 name[2]=Windows2000 size[2]=11
14.freopen(打开文件)
相关函数
fopen,fclose
表头文件 #include
定义函数 FILE * freopen(const char *
path,const char * mode,FILE * stream);
函数说明
参数path字符串包含欲打开的文件路径及文件名,参数mode请参考fopen()说明。参数stream为已打开的文件指针。Freopen()会将原stream所打开的文件流关闭,然后打开参数path的文件。
返回值
文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。
范例
#include<stdio.h> main() { FILE * fp; fp=fopen(“/etc/passwd”,”r”); fp=freopen(“/etc/group”,”r”,fp); fclose(fp); }
15.fseek(移动文件流的读写位置)
相关函数
rewind,ftell,fgetpos,fsetpos,lseek
表头文件 #include
定义函数 int
fseek(FILE * stream,long offset,int whence);
函数说明
fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。
参数
whence为下列其中一种:
SEEK_SET从距文件开头offset位移量为新的读写位置。SEEK_CUR
以目前的读写位置往后增加offset个位移量。
SEEK_END将读写位置指向文件尾后再增加offset个位移量。
当whence值为SEEK_CUR
或SEEK_END时,参数offset允许负值的出现。
下列是较特别的使用方式:
1) 欲将读写位置移动到文件开头时:fseek(FILE *stream,0,SEEK_SET);
2)
欲将读写位置移动到文件尾时:fseek(FILE *stream,0,0SEEK_END);
返回值
当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码。
附加说明
fseek()不像lseek()会返回读写位置,因此必须使用ftell()来取得目前读写的位置。
范例
#include<stdio.h> main() { FILE * stream; long offset; fpos_t pos; stream=fopen(“/etc/passwd”,”r”); fseek(stream,5,SEEK_SET); printf(“offset=%d/n”,ftell(stream)); rewind(stream); fgetpos(stream,&pos); printf(“offset=%d/n”,pos); pos=10; fsetpos(stream,&pos); printf(“offset = %d/n”,ftell(stream)); fclose(stream); } 执行 offset = 5 offset =0 offset=10
16.ftell(取得文件流的读取位置)
相关函数
fseek,rewind,fgetpos,fsetpos
表头文件 #include
定义函数 long
ftell(FILE * stream);
函数说明 ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。
返回值
当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。
错误代码 EBADF
参数stream无效或可移动读写位置的文件流。
范例 参考fseek()。
17.fwrite(将数据写至文件流)
相关函数
fopen,fread,fseek,fscanf
表头文件 #include
定义函数 size_t
fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
函数说明
fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr
指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。
返回值
返回实际写入的nmemb数目。
范例
#include<stdio.h> #define set_s (x,y) {strcoy(s[x].name,y);s[x].size=strlen(y);} #define nmemb 3 struct test { char name[20]; int size; }s[nmemb]; main() { FILE * stream; set_s(0,”Linux!”); set_s(1,”FreeBSD!”); set_s(2,”Windows2000.”); stream=fopen(“/tmp/fwrite”,”w”); fwrite(s,sizeof(struct test),nmemb,stream); fclose(stream); } 执行 参考fread()。
18.getc(由文件中读取一个字符)
相关函数
read,fopen,fread,fgetc
表头文件 #include
定义函数 int getc(FILE *
stream);
函数说明
getc()用来从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。虽然getc()与fgetc()作用相同,但getc()为宏定义,非真正的函数调用。
返回值
getc()会返回读取到的字符,若返回EOF则表示到了文件尾。
范例
参考fgetc()。
19.getchar(由标准输入设备内读进一字符)
相关函数
fopen,fread,fscanf,getc
表头文件 #include
定义函数 int
getchar(void);
函数说明 getchar()用来从标准输入设备中读取一个字符。然后将该字符从unsigned
char转换成int后返回。
返回值 getchar()会返回读取到的字符,若返回EOF则表示有错误发生。
附加说明
getchar()非真正函数,而是getc(stdin)宏定义。
范例
#include<stdio.h> main() { FILE * fp; int c,i; for(i=0li<5;i++) { c=getchar(); putchar(c); } } 执行 1234 /*输入*/ 1234 /*输出*/
20.gets(由标准输入设备内读进一字符串)
相关函数
fopen,fread,fscanf,fgets
表头文件 #include
定义函数 char *
gets(char *s);
函数说明
gets()用来从标准设备读入字符并存到参数s所指的内存空间,直到出现换行字符或读到文件尾为止,最后加上NULL作为字符串结束。
返回值
gets()若成功则返回s指针,返回NULL则表示有错误发生。
附加说明
由于gets()无法知道字符串s的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓冲溢出的安全性问题。建议使用fgets()取代。
范例
参考fgets()
21.mktemp(产生唯一的临时文件名)
相关函数
tmpfile
表头文件 #include
定义函数 char * mktemp(char *
template);
函数说明
mktemp()用来产生唯一的临时文件名。参数template所指的文件名称字符串中最后六个字符必须是XXXXXX。产生后的文件名会借字符串指针返回。
返回值
文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。
附加说明 参数template所指的文件名称字符串必须声明为数组,如:
char template[ ]=”template-XXXXXX”;
不可用char
* template=”template-XXXXXX”;
范例
#include<stdlib.h> main() { char template[ ]=”template-XXXXXX”; mktemp(template); printf(“template=%s/n”,template); }
22.putc(将一指定字符写入文件中)
相关函数
fopen,fwrite,fscanf,fputc
表头文件 #include
定义函数 int putc(int
c,FILE * stream);
函数说明 putc()会将参数c转为unsigned
char后写入参数stream指定的文件中。虽然putc()与fputc()作用相同,但putc()为宏定义,非真正的函数调用。
返回值
putc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。
范例
参考fputc()。
23.putchar(将指定的字符写到标准输出设备)
相关函数
fopen,fwrite,fscanf,fputc
表头文件 #include
定义函数 int putchar
(int c);
函数说明 putchar()用来将参数c字符写到标准输出设备。
返回值
putchar()会返回输出成功的字符,即参数c。若返回EOF则代表输出失败。
附加说明
putchar()非真正函数,而是putc(c,stdout)宏定义。
范例
参考getchar()。
24.rewind(重设文件流的读写位置为文件开头)
相关函数
fseek,ftell,fgetpos,fsetpos
表头文件 #include
定义函数 void
rewind(FILE * stream);
函数说明
rewind()用来把文件流的读写位置移至文件开头。参数stream为已打开的文件指针。此函数相当于调用fseek(stream,0,SEEK_SET)。
返回值
范例
参考fseek()
25.setbuf(设置文件流的缓冲区)
相关函数
setbuffer,setlinebuf,setvbuf
表头文件 #include
定义函数 void
setbuf(FILE * stream,char * buf);
函数说明
在打开文件流后,读取内容之前,调用setbuf()可以用来设置文件流的缓冲区。参数stream为指定的文件流,参数buf指向自定的缓冲区起始地址。如果参数buf为NULL指针,则为无缓冲IO。Setbuf()相当于调用:setvbuf(stream,buf,buf?_IOFBF:_IONBF,BUFSIZ)
返回值
26.setbuffer(设置文件流的缓冲区)
相关函数
setlinebuf,setbuf,setvbuf
表头文件 #include
定义函数 void
setbuffer(FILE * stream,char * buf,size_t size);
函数说明
在打开文件流后,读取内容之前,调用setbuffer()可用来设置文件流的缓冲区。参数stream为指定的文件流,参数buf指向自定的缓冲区起始地址,参数size为缓冲区大小。
返回值
27.setlinebuf(设置文件流为线性缓冲区)
相关函数
setbuffer,setbuf,setvbuf
表头文件 #include
定义函数 void
setlinebuf(FILE * stream);
函数说明
setlinebuf()用来设置文件流以换行为依据的无缓冲IO。相当于调用:setvbuf(stream,(char *
)NULL,_IOLBF,0);请参考setvbuf()。
返回值
28.setvbuf(设置文件流的缓冲区)
相关函数
setbuffer,setlinebuf,setbuf
表头文件 #include
定义函数 int
setvbuf(FILE * stream,char * buf,int mode,size_t size);
函数说明
在打开文件流后,读取内容之前,调用setvbuf()可以用来设置文件流的缓冲区。参数stream为指定的文件流,参数buf指向自定的缓冲区起始地址,参数size为缓冲区大小,参数mode有下列几种
_IONBF
无缓冲IO
_IOLBF 以换行为依据的无缓冲IO
_IOFBF
完全无缓冲IO。如果参数buf为NULL指针,则为无缓冲IO。
返回值
29.ungetc(将指定字符写回文件流中)
相关函数
fputc,getchar,getc
表头文件 #include
定义函数 int ungetc(int c,FILE
* stream);
函数说明
ungetc()将参数c字符写回参数stream所指定的文件流。这个写回的字符会由下一个读取文件流的函数取得。
返回值 成功则返回c
字符,若有错误则返回EOF。
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = NULL; char* str; char re; int num = 10; str = (char*)malloc(100); //snprintf(str, 10,"test: %s", "0123456789012345678"); // printf("str=%s\n", str); fp = fopen("/local/test.c","a+"); if (fp==NULL){ printf("Fail to open file\n"); } // fseek(fp,-1,SEEK_END); num = ftell(fp); printf("test file long:%d\n",num); fscanf(fp,"%s",str); printf("str = %s\n",str); printf("test a: %s\n",str); while ((re=getc(fp))!=EOF){//getc可以用作fgetc用 printf("%c",re); } //fread(str,10,10,fp); fgets(str,100,fp); printf("test a: %s\n",str); sprintf(str,"xiewei test is:%s", "ABCDEFGHIGKMNI"); printf("str2=%s\n", str); // fprintf(fp,"%s\n",str); fwrite(str,2,10,fp); num = ftell(fp); if(str!=NULL){ free(str); } fclose(fp); return 0; }

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

C#是一種現代、面向對象的編程語言,由微軟開發並作為.NET框架的一部分。 1.C#支持面向對象編程(OOP),包括封裝、繼承和多態。 2.C#中的異步編程通過async和await關鍵字實現,提高應用的響應性。 3.使用LINQ可以簡潔地處理數據集合。 4.常見錯誤包括空引用異常和索引超出範圍異常,調試技巧包括使用調試器和異常處理。 5.性能優化包括使用StringBuilder和避免不必要的裝箱和拆箱。

C#.NET應用的測試策略包括單元測試、集成測試和端到端測試。 1.單元測試確保代碼的最小單元獨立工作,使用MSTest、NUnit或xUnit框架。 2.集成測試驗證多個單元組合的功能,常用模擬數據和外部服務。 3.端到端測試模擬用戶完整操作流程,通常使用Selenium進行自動化測試。

C#.NET依然重要,因為它提供了強大的工具和庫,支持多種應用開發。 1)C#結合.NET框架,使開發高效便捷。 2)C#的類型安全和垃圾回收機制增強了其優勢。 3).NET提供跨平台運行環境和豐富的API,提升了開發靈活性。

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#高級開發者面試需要掌握異步編程、LINQ、.NET框架內部工作原理等核心知識。 1.異步編程通過async和await簡化操作,提升應用響應性。 2.LINQ以SQL風格操作數據,需注意性能。 3..NET框架的CLR管理內存,垃圾回收需謹慎使用。

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。

C#在.NET中的編程過程包括以下步驟:1)編寫C#代碼,2)編譯為中間語言(IL),3)由.NET運行時(CLR)執行。 C#在.NET中的優勢在於其現代化語法、強大的類型系統和與.NET框架的緊密集成,適用於從桌面應用到Web服務的各種開發場景。
