[Linux]每次一行的標準I/O
阿新 • • 發佈:2020-09-15
一、概述
呼叫fgets的流只有在以下3種情況下才會刷出緩衝區(即函式返回):
- 遇上換行符;
- 填滿自定義緩衝區的指定長度n - 1個位元組,也就是說假設自定義緩衝區長度為8,那麼滿7個位元組就會返回。(造成這一結果的原因是函式要保證每次返回的字串後面不是接\n就是接\0,如果輸入內容在填滿緩衝區之前還沒有換行符,那麼函式就要把末尾的一個位元組設定為\0,確保返回的字串帶\0);
- 出錯或者到達檔案末尾(EOF);
二、示例
編寫一段這樣的程式碼,結尾追加一個"|"字元好區分fgets返回的次數:
#include <stdio.h> #include <stdlib.h> #defineBUFFSIZE 8 int main(void) { char* buff = malloc(BUFFSIZE); char* receive = NULL; while((receive = fgets(buff, BUFFSIZE, stdin)) != NULL) { printf("%s|", receive); } return 0; }
驗證情況1:
輸入:
123 456789
輸出:
123 |456789|
可見兩次返回,第一次輸出123\n,第二次返回456789\0;
驗證情況2:
輸入:
12345678
輸出:
1234567|8|
可見兩次輸出,第一次由於輸入填滿了緩衝區n - 1即7位元組,所以輸出了1234567\0,第二次輸出剩下的8\0;