(C/C++學習)2.C語言中文件流操作基本函數總結


函數所在頭文件: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 }

程序運行結果:


 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM