實用指南:【18】C實戰篇——C語言 文件讀寫【fputc、fgetc、fputs、fgets】
文章目錄
- 3 文件的順序讀寫
- 3.1 逐字符讀寫
- 3.1.1 逐字符寫 fputc
- 3.1.2 逐字符讀 fgetc
- 3.2 文本行的讀寫
- 3.2.1 文本行的寫 fputs
- 3.2.2 文本行的寫 fgets
3 文件的順序讀寫

說到流,這里我們進行簡單科普:
讀寫文件時我們需要:
- 打開文件
- 讀寫文件
- 關閉文件
例如:我們在使用scanf,和printf時,并沒有什么打開鍵盤,打開屏幕等一系列操作,默認就直接進行操作。
這是因為C程序只要運行起來,就默認打開三個流:
標準輸入流 stdin
標準輸出流 stdout
標準錯誤流 stderr
所以在使用scanf,printf時就可以默認使用。 它們的類型都是FILE*類型。
什么是流?
流是指數據在計算機中的傳輸方式,它是數據的有序序列,可以是字節、字符、圖像、音頻或視頻等形式輸入流用于從外部讀取數據到計算機內存中,而輸出流則用于將計算機內存中的數據寫入到外部設備或文件中。流的操作可以是順序的,也可以是隨機的。
我們繼續回到文件讀寫函數。
fgetc是字符輸入函數,一次讀入一個字符到程序當中,
fputc是字符輸出函數,一次輸出一個字符,它們都是適用于所有流的,可以是從鍵盤輸入,也可以是從文件里讀取輸入。
至于輸出,可以輸出到屏幕上,也可以輸出到文件里。
3.1 逐字符讀寫
3.1.1 逐字符寫 fputc
我們可以來嘗試一下寫文件:
寫26個字母寫到這個data.txt文件中。
#include<stdio.h>
int main()
{
FILE* pf = fopen("data.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
int i = 0;
for (i = 0; i < 26; i++)
{
fputc('a' + i, pf);
}
fclose(pf);
pf = NULL;
return 0;
}
我們運行一下程序,在當前程序路徑下找到data.txt文件。打開來看,它確實會按照順序寫入26個字母。
如果我們想要輸出到屏幕上,就只需把fputc('a' + i, pf);里的pf換成stdout就行了
//輸出(寫)到 文本
//fputc('a' + i, pf);
//輸出(寫)到 屏幕
fputc('a' + i, stdout);

3.1.2 逐字符讀 fgetc
接下來我們嘗試一下讀文件:
我們將剛剛寫入的文件數據保存,然后對文件進行讀取數據:
#include<stdio.h>
int main()
{
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
int ch;
for (int i = 0; i < 26; i++) {
//從文本 讀取
ch = fgetc(pf);
//從鍵盤 讀取
//ch = fgetc(stdin);
printf("%c", ch);
}
fclose(pf);
pf = NULL;
return 0;
}

這里fgetc的返回值是int類型,如果遇到文件末尾或者讀取失敗會返回EOF。
此外fgetc函數還可以從鍵盤上讀取,只需將fgetc(pf)改成fgetc(stdin);
3.2 文本行的讀寫
fgets和fputs
3.2.1 文本行的寫 fputs
或許大家會想一次讀寫一個字符太麻煩了。接下來就是文本行的讀寫。
int main()
{
FILE* pf = fopen("data.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputs("abcdef", pf);
fclose(pf);
pf = NULL;
return 0;
}
這次我們重新讀入,一次讀入abcdef這6個字符。因為是同對一個文件進行操作,所有原先寫入的數據會被覆蓋。
我們再次打開data.txt ,可以觀察到,文件中只有新寫入abcdef。

3.2.2 文本行的寫 fgets
fgets的參數依次是,讀取后存放的位置,讀取的字符個數(n-1)個,讀取數據的位置。
我們可以先在讀數據的文件中輸入長度超過20的字符進行驗證。
下面時26個字符,n=20;

int main()
{
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
char ch[20] = { 0 };
fgets(ch, 20, pf);//讀num-1個
printf("%s\n", ch);
fclose(pf);
pf = NULL;
return 0;
}
可以看到 讀取了 19個字符 ,//讀num-1個


浙公網安備 33010602011771號