1. 程式人生 > 其它 >fgets 和 fscanf 對換行符的處理

fgets 和 fscanf 對換行符的處理

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'不輸出