溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c語言文件讀寫的操作方法有哪些

發(fā)布時間:2023-01-05 15:43:04 來源:億速云 閱讀:199 作者:iii 欄目:編程語言

本篇內容介紹了“c語言文件讀寫的操作方法有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

c語言的文件讀寫操作:1、用fgetc()和fputc()函數以字符形式讀寫文件,語法“fgetc(文件指針);”和“fputc (要寫入的字符,文件指針);”;2、用fgets()和fputs()函數以字符串的形式讀寫文件,語法“fgets (字符數組,讀取個數,文件指針)”和“fputs(字符串,文件指針)”;3、用fread()和fwrite()以數據塊的形式讀寫文件。

在C語言中,讀寫文件比較靈活,既可以每次讀寫一個字符,也可以讀寫一個字符串,甚至是任意字節(jié)的數據(數據塊)。

以字符形式讀寫文件

以字符形式讀寫文件時,每次可以從文件中讀取一個字符,或者向文件中寫入一個字符。主要使用兩個函數,分別是 fgetc() 和 fputc()。

1、字符讀取函數 fgetc

fgetc 是 file get char 的縮寫,意思是從指定的文件中讀取一個字符。fgetc() 的用法為:

int fgetc (FILE *fp);

fp 為文件指針。fgetc() 讀取成功時返回讀取到的字符,讀取到文件末尾或讀取失敗時返回EOF。

EOF 是 end of file 的縮寫,表示文件末尾,是在 stdio.h 中定義的宏,它的值是一個負數,往往是 -1。fgetc() 的返回值類型之所以為 int,就是為了容納這個負數(char不能是負數)。

EOF 不絕對是 -1,也可以是其他負數,這要看編譯器的實現。

fgetc() 的用法舉例:

char ch;
FILE *fp = fopen("D:\\demo.txt", "r+");
ch = fgetc(fp);

表示從D:\\demo.txt文件中讀取一個字符,并保存到變量 ch 中。

在文件內部有一個位置指針,用來指向當前讀寫到的位置,也就是讀寫到第幾個字節(jié)。在文件打開時,該指針總是指向文件的第一個字節(jié)。使用 fgetc() 函數后,該指針會向后移動一個字節(jié),所以可以連續(xù)多次使用 fgetc() 讀取多個字符。

注意:這個文件內部的位置指針與C語言中的指針不是一回事。位置指針僅僅是一個標志,表示文件讀寫到的位置,也就是讀寫到第幾個字節(jié),它不表示地址。文件每讀寫一次,位置指針就會移動一次,它不需要你在程序中定義和賦值,而是由系統(tǒng)自動設置,對用戶是隱藏的。

【示例】在屏幕上顯示 D:\\demo.txt 文件的內容。

#include<stdio.h>
int main(){
    FILE *fp;
    char ch;
   
    //如果文件不存在,給出提示并退出
    if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    //每次讀取一個字節(jié),直到讀取完畢
    while( (ch=fgetc(fp)) != EOF ){
        putchar(ch);
    }
    putchar('\n');  //輸出換行符
    fclose(fp);
    return 0;
}

在D盤下創(chuàng)建 demo.txt 文件,輸入任意內容并保存,運行程序,就會看到剛才輸入的內容全部都顯示在屏幕上。

該程序的功能是從文件中逐個讀取字符,在屏幕上顯示,直到讀取完畢。

程序第 13 行是關鍵,while 循環(huán)的條件為(ch=fgetc(fp)) != EOF。fget() 每次從位置指針所在的位置讀取一個字符,并保存到變量 ch,位置指針向后移動一個字節(jié)。當文件指針移動到文件末尾時,fget() 就無法讀取字符了,于是返回 EOF,表示文件讀取結束了。

對 EOF 的說明:

EOF 本來表示文件末尾,意味著讀取結束,但是很多函數在讀取出錯時也返回 EOF,那么當返回 EOF 時,到底是文件讀取完畢了還是讀取出錯了?我們可以借助 stdio.h 中的兩個函數來判斷,分別是 feof() 和 ferror()。

feof() 函數用來判斷文件內部指針是否指向了文件末尾,它的原型是:

int feof ( FILE * fp );

當指向文件末尾時返回非零值,否則返回零值。

ferror() 函數用來判斷文件操作是否出錯,它的原型是:

int ferror ( FILE *fp );

出錯時返回非零值,否則返回零值。

需要說明的是,文件出錯是非常少見的情況,上面的示例基本能夠保證將文件內的數據讀取完畢。如果追求完美,也可以加上判斷并給出提示:

#include<stdio.h>
int main(){
    FILE *fp;
    char ch;
  
    //如果文件不存在,給出提示并退出
    if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    //每次讀取一個字節(jié),直到讀取完畢
    while( (ch=fgetc(fp)) != EOF ){
        putchar(ch);
    }
    putchar('\n');  //輸出換行符
    if(ferror(fp)){
        puts("讀取出錯");
    }else{
        puts("讀取成功");
    }
    fclose(fp);
    return 0;
}

這樣,不管是出錯還是正常讀取,都能夠做到心中有數。

2、字符寫入函數 fputc

fputc 是 file output char 的所以,意思是向指定的文件中寫入一個字符。fputc() 的用法為:

int fputc ( int ch, FILE *fp );

ch 為要寫入的字符,fp 為文件指針。fputc() 寫入成功時返回寫入的字符,失敗時返回 EOF,返回值類型為 int 也是為了容納這個負數。例如:

fputc('a', fp);

或者:

char ch = 'a';
fputc(ch, fp);

表示把字符 'a' 寫入fp所指向的文件中。

兩點說明

  • 1) 被寫入的文件可以用寫、讀寫、追加方式打開,用寫或讀寫方式打開一個已存在的文件時將清除原有的文件內容,并將寫入的字符放在文件開頭。如需保留原有文件內容,并把寫入的字符放在文件末尾,就必須以追加方式打開文件。不管以何種方式打開,被寫入的文件若不存在時則創(chuàng)建該文件。

  • 2) 每寫入一個字符,文件內部位置指針向后移動一個字節(jié)。

【示例】從鍵盤輸入一行字符,寫入文件。

#include<stdio.h>
int main(){
    FILE *fp;
    char ch;
    //判斷文件是否成功打開
    if( (fp=fopen("D:\\demo.txt","wt+")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    printf("Input a string:\n");
    //每次從鍵盤讀取一個字符并寫入文件
    while ( (ch=getchar()) != '\n' ){
        fputc(ch,fp);
    }
    fclose(fp);
    return 0;
}

運行程序,輸入一行字符并按回車鍵結束,打開D盤下的 demo.txt 文件,就可以看到剛才輸入的內容。

程序每次從鍵盤讀取一個字符并寫入文件,直到按下回車鍵,while 條件不成立,結束讀取。

以字符串的形式讀寫文件

fgetc() 和 fputc() 函數每次只能讀寫一個字符,速度較慢;實際開發(fā)中往往是每次讀寫一個字符串或者一個數據塊,這樣能明顯提高效率。

1、讀字符串函數 fgets

fgets() 函數用來從指定的文件中讀取一個字符串,并保存到字符數組中,它的用法為:

char *fgets ( char *str, int n, FILE *fp );

str 為字符數組,n 為要讀取的字符數目,fp 為文件指針。

返回值:讀取成功時返回字符數組首地址,也即 str;讀取失敗時返回 NULL;如果開始讀取時文件內部指針已經指向了文件末尾,那么將讀取不到任何字符,也返回 NULL。

注意,讀取到的字符串會在末尾自動添加 '\0',n 個字符也包括 '\0'。也就是說,實際只讀取到了 n-1 個字符,如果希望讀取 100 個字符,n 的值應該為 101。例如:

#define N 101
char str[N];
FILE *fp = fopen("D:\\demo.txt", "r");
fgets(str, N, fp);

表示從 D:\\demo.txt 中讀取 100 個字符,并保存到字符數組 str 中。

需要重點說明的是,在讀取到 n-1 個字符之前如果出現了換行,或者讀到了文件末尾,則讀取結束。這就意味著,不管 n 的值多大,fgets() 最多只能讀取一行數據,不能跨行。在C語言中,沒有按行讀取文件的函數,我們可以借助 fgets(),將 n 的值設置地足夠大,每次就可以讀取到一行數據。

【示例】一行一行地讀取文件。

#include <stdio.h>
#include <stdlib.h>
#define N 100
int main(){
    FILE *fp;
    char str[N+1];
    if( (fp=fopen("d:\\demo.txt","rt")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
   
    while(fgets(str, N, fp) != NULL){
        printf("%s", str);
    }
    fclose(fp);
    return 0;
}

將下面的內容復制到 D:\\demo.txt:

億速云
http://kemok4.com/

那么運行結果為:

c語言文件讀寫的操作方法有哪些

fgets() 遇到換行時,會將換行符一并讀取到當前字符串。該示例的輸出結果之所以和 demo.txt 保持一致,該換行的地方換行,就是因為 fgets() 能夠讀取到換行符。而 gets() 不一樣,它會忽略換行符。

2、寫字符串函數 fputs

fputs() 函數用來向指定的文件寫入一個字符串,它的用法為:

int fputs( char *str, FILE *fp );

str 為要寫入的字符串,fp 為文件指針。寫入成功返回非負數,失敗返回 EOF。例如:

char *str = "http://c.biancheng.net";
FILE *fp = fopen("D:\\demo.txt", "at+");
fputs(str, fp);

表示把把字符串 str 寫入到 D:\\demo.txt 文件中。

【示例】向上例中建立的 d:\\demo.txt 文件中追加一個字符串。

#include<stdio.h>
int main(){
    FILE *fp;
    char str[102] = {0}, strTemp[100];
    if( (fp=fopen("D:\\demo.txt", "at+")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    printf("Input a string:");
    gets(strTemp);
    strcat(str, "\n");
    strcat(str, strTemp);
    fputs(str, fp);
    fclose(fp);
    return 0;
}

運行程序,輸入C C++ Java Linux Shell,打開 D:\\demo.txt,文件內容為:

c語言文件讀寫的操作方法有哪些

以數據塊的形式讀寫文件

fgets() 有局限性,每次最多只能從文件中讀取一行內容,因為 fgets() 遇到換行符就結束讀取。如果希望讀取多行內容,需要使用 fread() 函數;相應地寫入函數為 fwrite()。

對于 Windows 系統(tǒng),使用 fread() 和 fwrite() 時應該以二進制的形式打開文件。

fread() 函數用來從指定文件中讀取塊數據。所謂塊數據,也就是若干個字節(jié)的數據,可以是一個字符,可以是一個字符串,可以是多行數據,并沒有什么限制。fread() 的原型為:

size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );

fwrite() 函數用來向文件中寫入塊數據,fwrite() 函數的原型為:

size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );

對參數的說明:

  • ptr 為內存區(qū)塊的指針,它可以是數組、變量、結構體等。fread() 中的 ptr 用來存放讀取到的數據,fwrite() 中的 ptr 用來存放要寫入的數據。

  • size:表示每個數據塊的字節(jié)數。

  • count:表示要讀寫的數據塊的塊數。

  • fp:表示文件指針。

  • 理論上,每次讀寫 size*count 個字節(jié)的數據。

size_t 是在 stdio.h 和 stdlib.h 頭文件中使用 typedef 定義的數據類型,表示無符號整數,也即非負數,常用來表示數量。

返回值:返回成功讀寫的塊數,也即 count。如果返回值小于 count:

  • 對于 fwrite() 來說,肯定發(fā)生了寫入錯誤,可以用 ferror() 函數檢測。

  • 對于 fread() 來說,可能讀到了文件末尾,可能發(fā)生了錯誤,可以用 ferror() 或 feof() 檢測。

【示例】從鍵盤輸入一個數組,將數組寫入文件再讀取出來。

#include<stdio.h>
#define N 5
int main(){
    //從鍵盤輸入的數據放入a,從文件讀取的數據放入b
    int a[N], b[N];
    int i, size = sizeof(int);
    FILE *fp;
    if( (fp=fopen("D:\\demo.txt", "rb+")) == NULL ){  //以二進制方式打開
        puts("Fail to open file!");
        exit(0);
    }
  
    //從鍵盤輸入數據 并保存到數組a
    for(i=0; i<N; i++){
        scanf("%d", &a[i]);
    }
    //將數組a的內容寫入到文件
    fwrite(a, size, N, fp);
    //將文件中的位置指針重新定位到文件開頭
    rewind(fp);
    //從文件讀取內容并保存到數組b
    fread(b, size, N, fp);
    //在屏幕上顯示數組b的內容
    for(i=0; i<N; i++){
        printf("%d ", b[i]);
    }
    printf("\n");
    fclose(fp);
    return 0;
}

運行結果:

23 409 500 100 222↙
23 409 500 100 222

打開 D:\\demo.txt,發(fā)現文件內容根本無法閱讀。這是因為我們使用"rb+"方式打開文件,數組會原封不動地以二進制形式寫入文件,一般無法閱讀。

數據寫入完畢后,位置指針在文件的末尾,要想讀取數據,必須將文件指針移動到文件開頭,這就是rewind(fp);的作用。更多關于rewind函數的內容請點擊:C語言rewind函數。

文件的后綴不一定是 .txt,它可以是任意的,你可以自己命名,例如 demo.ddd、demo.doc、demo.diy 等。

【示例】從鍵盤輸入兩個學生數據,寫入一個文件中,再讀出這兩個學生的數據顯示在屏幕上。

#include<stdio.h>
#define N 2
struct stu{
    char name[10]; //姓名
    int num;  //學號
    int age;  //年齡
    float score;  //成績
}boya[N], boyb[N], *pa, *pb;
int main(){
    FILE *fp;
    int i;
    pa = boya;
    pb = boyb;
    if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    //從鍵盤輸入數據
    printf("Input data:\n");
    for(i=0; i<N; i++,pa++){
        scanf("%s %d %d %f",pa->name, &pa->num,&pa->age, &pa->score);
    }
    //將數組 boya 的數據寫入文件
    fwrite(boya, sizeof(struct stu), N, fp);
    //將文件指針重置到文件開頭
    rewind(fp);
    //從文件讀取數據并保存到數據 boyb
    fread(boyb, sizeof(struct stu), N, fp);
    //輸出數組 boyb 中的數據
    for(i=0; i<N; i++,pb++){
        printf("%s  %d  %d  %f\n", pb->name, pb->num, pb->age, pb->score);
    }
    fclose(fp);
    return 0;
}

運行結果:

Input data:
Tom 2 15 90.5↙
Hua 1 14 99↙
Tom  2  15  90.500000
Hua  1  14  99.000000

“c語言文件讀寫的操作方法有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI