fgets 和 fscanf 對換行符的處理
阿新 • • 發佈:2021-10-09
fgets 和 fscanf 對換行符的處理
fscanf
int fscanf ( FILE * stream, const char * format, ... );
fscanf 將讀取並忽略在下一個非空白字元之前遇到的任何空白字元(空白字元包括空格、換行符和製表符)。
fscanf 讀取字串時,讀取任意數量的非空白字元,在找到的第一個空白字元處停止。在儲存序列的末尾自動新增終止空字元。
fgets
char * fgets ( char * str, int num, FILE * stream );
換行符使 fgets 停止讀取,但它被函式視為有效字元幷包含在複製到 str 的字串中。
fgets 只能讀取 num - 1 個字元,包括最後的換行符,在複製到 str 的字元後自動附加終止空字元。
驗證例項
總之,fscanf 不會讀取換行符,讀取之前會跳過所有換行符,讀到換行符停止(流中的換行符還在)。
fgets 讀取一行,讀到換行符為止,但會讀掉換行符(流中的換行符沒有了)。
因此,如果使用了 fscanf 讀取一行的內容,流中會剩餘一個換行符,再使用 fgets 只會讀到這個剩餘的換行符,不會讀取下一行。需要再使用 fgets 才能讀取下一行。
#include <stdio.h> int main() { FILE *fp = fopen("test.txt", "r"); char line[20]; int a, b, c; fscanf(fp, "%d %d %s", &a, &b, line); fprintf(stdout, "%s", line); // String1 fgets(line, 20, fp); fprintf(stdout, "%s\n", line); // '\n' fgets(line, 20, fp); fprintf(stdout, "%s", line); // String2 }
[qhn@Tommy C_Prog]$ ./a
String1
String2
Breakpoint 1, main () at test.c:12
12 printf("%s", line); // '\n'
(gdb) print(line)
$1 = "\n\000ring1\000@\005@\000\000\000\000\000\340\340\377\377"
12 行不列印任何字元的原因參考 C程式設計中printf不加'\n'不輸出。