1. 程式人生 > 實用技巧 >[Linux]每次一行的標準I/O

[Linux]每次一行的標準I/O

一、概述

呼叫fgets的流只有在以下3種情況下才會刷出緩衝區(即函式返回):

  1. 遇上換行符;
  2. 填滿自定義緩衝區的指定長度n - 1個位元組,也就是說假設自定義緩衝區長度為8,那麼滿7個位元組就會返回。(造成這一結果的原因是函式要保證每次返回的字串後面不是接\n就是接\0,如果輸入內容在填滿緩衝區之前還沒有換行符,那麼函式就要把末尾的一個位元組設定為\0,確保返回的字串帶\0);
  3. 出錯或者到達檔案末尾(EOF);

二、示例

編寫一段這樣的程式碼,結尾追加一個"|"字元好區分fgets返回的次數:

#include <stdio.h>
#include <stdlib.h>

#define
BUFFSIZE 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;