函數所在頭文件:stdio.h
說明:前半部分主要為對各個文件流操作函數的例舉,后半部分着重於上機運行分析。文中部分引用自王桂林老師的C/C++課件。
1.FIELE *fopen(const char*filename,const char *mode)
以mode的方式,打開一個以filename(指針類型)命名的文件,返回一個指向該文件緩沖區的指針,該指針是后續操作的句柄。
2.int fclose(FILE *stream)
fclose()用來關閉先前用fopen()打開的文件。並讓文件緩沖區的數據寫入文件中,並釋放系統提供的文件資源。成功范返回0;失敗返回-1(EOF)。
示例1:
1 #include <stdio.h>
2
3 int main()
4 {
5 FILE * fp = fopen("data.txt", "w");
6 //以"w"的方式打開一個名為"data.txt"的文件,文件不存在則創建
7
8 //判斷文件是否都打開成功
9 if(fp == NULL)
10 {
11 printf("open error!\n");
12 return -1;
13 }
14 fputs("china is great!!", fp);
15 //向文件中寫入"chia is great!!"
16 fclose(fp);
17 //關閉文件
18 return 0;
19 }
20 //該程序運行完畢,在該工程目錄下生成了一個"data.txt"的文本文件,其內容為上述字符串
3.int fputc(int ch,FILE *stream)
將ch字符寫入文件,成功返回寫入字符,失敗返回-1。
int fputs(char *str,FILE *fp)
將str指向的字符串寫入fp指向的文件中,正常返回0;失敗返回1.
示例2:
1 #include <stdio.h>
2 int main()
3 {
4 FILE* fp = fopen("data.txt","w");
5 if(fp == NULL)
6 {
7 printf("open error\n");
8 return -1;
9 }
10 char ch;
11 for(ch = 'a'; ch<='z'; ch++)
12 printf("%3c",fputc(ch,fp));
13 //將字符寫入文本的同時,將其打印出來
14 fclose(fp);
15 return 0;
16 }
程序運行結果:
同時,也在工程目錄下生成了一個叫"data.txt"的文件,打開文件可以發現其內容為a~z。
4.int fgetc(FILE *stream)
從文件流中讀取一個字符並返回。成功返回讀取的字符;讀到文件末尾或失敗返回-1。
char *fgets(char *str,int length,FILE *fp)
從fp指向的文件中,至多讀length-1個字符,送入數組str中,如果在讀入length-1個字符結束前遇到\n或EOF,讀入即結束,字符串讀入后在最后加一個'\0'字符。正常返回str指針,出錯或遇到文件結尾,返回NULL指針。
示例3:
1 #include <stdio.h>
2 int main()
3 {
4 FILE* fp = fopen("data.txt","r");
5 //data.txt內容為a~z
6 if(fp == NULL)
7 {
8 printf("open error\n");
9 return -1;
10 }
11 char ch;
12 while((ch = fgetc(fp)) != EOF)
13 printf("%3c",ch);
14 fclose(fp);
15 return 0;
16 }
程序運行結果:
5.int feof(FILE *stream)
判斷文件是否讀到末尾,未讀到末尾返回0,讀到末尾返回非0。一般不用,文件讀到結尾,再去讀一次,容易導致多讀一次。不建議使用!
6.int fread(void* buffer,int num,int count,FILE *fp)
int fwrite(void*buffer,int num,int count,FILE *fp)
將buffer指向的數據寫入fp指向的文件中,或是把fp指向的文件中的數據讀到buffer中,num為每個要讀寫的字段數的字節數,count為要讀寫的字段數。成功返回讀/寫的字段數(count);出錯或文件結束返回0。這兩個函數不同於其它 函數,當我們試圖用fread/fwrite去讀寫文本文件的時候,發現文本中的格式己經沒有任何意義,只是一個普通的字符。它所進行的操作為二進制操作,通俗來說就是對一些文本標識符如'\0','\n'等已經不敏感了,這些文本標識符都被當做成一個二進制來讀寫。
7.void rewind(FILE *STREAM)
將文件指針重新指向一個流的開頭。
8.int ftell(FILE *stream)
得到流文件的當前讀寫位置,其返回值是當前讀寫位置偏離文件頭部的字節數。失敗返回-1。
9.int fseek(FILE *stream,long offset,int where)
偏移文件指針,成功返回0,失敗返回-1。where是偏移的起始位置。
//#define SEEK_CUR 1 當前位置
//#define SEEK_END 2 文件結尾
//#define SEEK_SET 0 文件開頭
fseek(fp,100L,0);把fp指針移動到離文件開頭100字節處;
fseek(fp,100L,1);把fp指針移動到離文件當前位置100字節處;
fseek(fp,-100,2);把fp指針退回到離文件結尾100字節處。
示例4:
1 #include <stdio.h>
2 int main()
3 {
4 FILE* fp = fopen("data.txt","w+");
5 if(fp == NULL)
6 {
7 printf("open error\n");
8 return -1;
9 }
10 char ch;
11 for( ch = 'a'; ch<='z'; ch++)
12 {
13 fputc(ch,fp);
14 }
15 rewind(fp);
16 //此處一定不能少,否則文件指針將指向文件末尾,而打印不出任何東西
17
18 while((ch = fgetc(fp))&& !feof(fp))
19 {
20 printf("%3c",ch);
21 }
22 fclose(fp);
23 return 0;
24 }
程序運行結果:
示例5:
1 #include <stdio.h>
2 int main()
3 {
4 FILE* fp = fopen("data.txt","w+");
5 if(fp == NULL)
6 {
7 printf("open error\n");
8 return -1;
9 }
10 fputs("abcd\nefg",fp);
11 rewind(fp);
12 char ch;
13 while((ch = fgetc(fp)) != EOF)
14 printf("%c",ch);
15 fclose(fp);
16 return 0;
17 }
程序運行結果:
示例6:下面是一個很有意思的程序,請判斷下fgets()共執行了多少次;先別看答案,相信這個理解了,這部分問題就不會太大,下面直接上程序:
1 #include <stdio.h>
2 int main()
3 {
4 FILE* fp = fopen("data.txt","r");
5 if(fp == NULL)
6 {
7 printf("open error\n");
8 return -1;
9 }
10 char buf[10] = {0};
11 int count = 0;
12 while(fgets(buf,10,fp) != NULL) //注意,即使沒遇到結束符,每次也只能讀9個字符
13 {
14 printf("%s",buf);
15 count++;
16 }
17 fclose(fp);
18 putchar(10);
19 printf("+++++++++%d++++++++++",count);
20 return 0;
21 }
其中data.txt是這樣的:
程序運行結果:
從運行結果來看,似乎是執行了5次,但仔細看看,真的是5次嗎?實際上,每讀取一次,判斷返回的指針是否為空,若不為空,則count加1,若為空,則不執行循環體。因此,實際上是讀取了6次,只是最后一次讀取后發現到了文件末尾,因此返回來一個空指針,判斷為空指針沒執行count++操作。值得注意的是fgets()每次讀取的字符數。
示例7:
1 #include <stdio.h>
2 int main()
3 {
4 FILE* fp = fopen("data.txt","w+");
5 if(fp == NULL)
6 {
7 printf("open error\n");
8 return -1;
9 }
10
11 fputs("china is great!!",fp);
12
13 int i = ftell(fp);
14 printf("%d\n",i);
15 //打印當前指針位置離文件頭的字節數
16 rewind(fp);
17 //讓文件指針指向文件頭
18 i = ftell(fp);
19 printf("%d\n",i);
20
21 char buf[20] = {0};
22 fgets(buf,20,fp);
23 printf("%s\n",buf);
24 fclose(fp);
25 return 0;
26 }
程序運行結果:
示例8:
1 #include <stdio.h>
2 int main()
3 {
4 FILE* fp = fopen("data.txt","w+");
5 if(fp == NULL)
6 {
7 printf("open error\n");
8 return -1;
9 }
10 fputs("china is great!!",fp);
11 fseek(fp,2,0);
12 //將文件指針偏移到離文件頭兩個字節的位置
13 char buf[20];
14 fgets(buf,20,fp);
15 printf("%s\n",buf);
16 fclose(fp);
17 return 0;
18 }
程序運行結果:
示例9:
1 #include <stdio.h>
2 #include <string.h>
3 int main()
4 {
5 FILE *fpw = fopen("bin.txt","wb+");
6 if(fpw == NULL)
7 return -1;
8 char *p = "china \n is \0 great";
9 fwrite(p,1,strlen(p)+7,fpw);
10 //將指針的內容寫入到文件中,由於strlen()所求長度
11 //遇到0截止,因此需將0后面的元素補上。
12
13 rewind(fpw);
14 char buf[1024];
15 int n = fread(buf,1,1024,fpw);
16 //每次讀取一個字節,讀取1024次,返回讀取的字段數(此處為字節數)
17 //遇到文件末尾或讀取錯誤返回0
18 printf("%d\n",n);
19 int i = 0;
20 for(i = 0;i<n;i++)
21 printf("%c",buf[i]);
22 fclose(fpw);
23 return 0;
24 }
程序運行結果: