1. 程式人生 > >C語言中文件流操作基本函數總結

C語言中文件流操作基本函數總結

打印 highlight -s 技術分享 null strong 進制 數組 for

函數所在頭文件: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:
#include <stdio.h>

int main()
{
    FILE * fp = fopen("data.txt", "w");
    //以"w"的方式打開一個名為"data.txt"的文件,文件不存在則創建
    
    //判斷文件是否都打開成功
    if(fp == NULL)   
    {
      printf("open error!\n");
      return -1;
    }
    fputs("china is great!!", fp);
    //向文件中寫入"chia is great!!"
    fclose(fp);
    //關閉文件
    return 0;
}
//該程序運行完畢,在該工程目錄下生成了一個"data.txt"的文本文件,其內容為上述字符串

  

 

3.int fputc(int ch,FILE *stream)
ch字符寫入文件,成功返回寫入字符,失敗返回-1
  int fputs(char *str,FILE *fp)
str指向的字符串寫入fp指向的文件中,正常返回0;失敗返回1.

示例2:
#include <stdio.h>
int main()
{
    FILE* fp = fopen("data.txt","w");
    if(fp == NULL)
    {
        printf("open error\n");
        return -1;
    }
    char ch;
    for(ch = ‘a‘; ch<=‘z‘; ch++)  
        printf("%3c",fputc(ch,fp));
//將字符寫入文本的同時,將其打印出來 fclose(fp); return 0; }

程序運行結果:

技術分享圖片

同時,也在工程目錄下生成了一個叫"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:
#include <stdio.h>    
int main()
{
    FILE* fp = fopen("data.txt","r");   
//data.txt內容為a~z if(fp == NULL) { printf("open error\n"); return -1; } char ch; while((ch = fgetc(fp)) != EOF) printf("%3c",ch); fclose(fp); return 0; }

程序運行結果:

技術分享圖片



5.int feof(FILE *stream)
判斷文件是否讀到末尾,未讀到末尾返回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:
#include <stdio.h>
int main()
{
    FILE* fp = fopen("data.txt","w+");
    if(fp == NULL)
    {
        printf("open error\n");
        return -1;
    }
    char ch;
    for( ch = ‘a‘; ch<=‘z‘; ch++)
    {
        fputc(ch,fp);
    }
    rewind(fp);     
//此處一定不能少,否則文件指針將指向文件末尾,而打印不出任何東西
while((ch = fgetc(fp))&& !feof(fp)) { printf("%3c",ch); } fclose(fp); return 0; }

程序運行結果:

技術分享圖片



示例5:
#include <stdio.h>
int main()
{
    FILE* fp = fopen("data.txt","w+");
    if(fp == NULL)
    {
        printf("open error\n");
        return -1;
    }
    fputs("abcd\nefg",fp);
    rewind(fp);
    char ch;
    while((ch = fgetc(fp)) != EOF)
          printf("%c",ch);
    fclose(fp);
    return 0;
}

程序運行結果:

技術分享圖片


示例6:
下面是一個很有意思的程序,請判斷下fgets()共執行了多少次;
先別看答案,相信這個理解了,這部分問題就不會太大,下面直接
上程序:
#include <stdio.h>
int main()
{
    FILE* fp = fopen("data.txt","r");
    if(fp == NULL)
    {
        printf("open error\n");
        return -1;
    }
    char buf[10] = {0};
    int count = 0;
    while(fgets(buf,10,fp) != NULL)   //註意,即使沒遇到結束符,每次也只能讀9個字符
    {
        printf("%s",buf);
        count++;
    }
    fclose(fp);
    putchar(10);
   printf("+++++++++%d++++++++++",count);
    return 0;
}

其中data.txt是這樣的:

技術分享圖片

程序運行結果:

技術分享圖片

從運行結果來看,似乎是執行了5次,但仔細看看,真的是5次嗎?

實際上,每讀取一次,判斷返回的指針是否為空,若不為空,則count加

1,若為空,則不執行循環體。因此,實際上是讀取了6次,只是最後一

次讀取後發現到了文件末尾,因此返回來一個空指針,判斷為空指針

沒執行count++操作。值得註意的是fgets()每次讀取的字符數。

示例7:

#include <stdio.h>
int main()
{
    FILE* fp = fopen("data.txt","w+");
    if(fp == NULL)
    {
        printf("open error\n");
        return -1;
    }
    
    fputs("china is great!!",fp);
    
    int i = ftell(fp);
    printf("%d\n",i);
    //打印當前指針位置離文件頭的字節數
    rewind(fp);
    //讓文件指針指向文件頭
    i = ftell(fp);
    printf("%d\n",i);
char buf[20] = {0}; fgets(buf,20,fp); printf("%s\n",buf); fclose(fp); return 0; }

程序運行結果: 

技術分享圖片

示例8:
#include <stdio.h>
int main()
{
    FILE* fp = fopen("data.txt","w+");
    if(fp == NULL)
    {
        printf("open error\n");
        return -1;
    }
    fputs("china is great!!",fp);
    fseek(fp,2,0);
//將文件指針偏移到離文件頭兩個字節的位置 char buf[20]; fgets(buf,20,fp); printf("%s\n",buf); fclose(fp); return 0; }
程序運行結果:
技術分享圖片

示例9:
#include <stdio.h>
#include <string.h>
int main()
{
    FILE *fpw = fopen("bin.txt","wb+");
    if(fpw == NULL)
        return -1;
    char *p = "china \n is \0 great";
    fwrite(p,1,strlen(p)+7,fpw);
//將指針的內容寫入到文件中,由於strlen()所求長度
//遇到0截止,因此需將0後面的元素補上。
rewind(fpw); char buf[1024]; int n = fread(buf,1,1024,fpw);
//每次讀取一個字節,讀取1024次,返回讀取的字段數(此處為字節數)
//遇到文件末尾或讀取錯誤返回0 printf("%d\n",n); int i = 0; for(i = 0;i<n;i++) printf("%c",buf[i]); fclose(fpw); return 0; }

程序運行結果:

技術分享圖片


 
 

C語言中文件流操作基本函數總結