[英]C - How fgets works with mutiple calls
我有以下代碼:
int i = 0;
char ar[500];
while(i < 20)
{
printf("Type a line: ");
fgets(ar, 500, stdin);
fprintf(fp,"%s", ar);
i++;
}
基本上,我試圖打開一個文件,然后從用戶那里獲取20行輸入並將其存儲在數組中,然后將其打印到文件中。 它工作正常,但我不明白fgets在while循環中如何工作。 據我了解,當i = 0時,fgets將第一行存儲到ar [500]中,而fprintf將其輸出到文件中,當i = 1時,fgets將第二行存儲到ar [500]中,但是現在ar [500]有2行,但是為什么當我遞增1時,為什么fprintf僅將第二行打印到文件,而不是所有2行,依此類推。
fgets總是開始在arr [0]處填充數組。 在每次迭代時,前一行將被覆蓋。 fgets將在arr中為您添加空終止符,因此僅當前讀取的行將輸出到fp指向的FILE中。
char *fgets(char * restrict s, int n, FILE * restrict stream);
是(C11 7.21.7p2) :
2
fgets
函數從stream指向的流到s
指向的數組中讀取的字符數最多少於n
指定的字符數。 在換行符(保留)或文件結束之后,不會讀取其他字符。 在將最后一個字符讀入數組后,立即寫入空字符。
fgets
讀取的第一個字符將始終存儲在s[0]
,依此類推,直到最多s[n - 1]
或遇到的第一個換行符(它是最后存儲的字符)。 讀取的最后一個字符之后的元素將設置為'\\0'
,從而終止字符串。
即有效地fgets
調用將覆蓋數組中的k + 1
第一個元素,其中k
為行的長度或n
,取較小者, 1
表示空終止。
要存儲20行,您需要一個數組數組:
char ar[20][500];
然后讀入ar[i]
。
每次都將覆蓋緩沖區ar
。
fgets
具有原型char *fgets(char *str, int n, FILE *stream)
。 它將從stream
讀取最多n-1
字符並將它們寫入str
,然后添加'\\0'
字符。
關於:“但是ar [500]現在有2行,”
不,函數fgets()
不追加。
而是覆蓋。
在發布的代碼中,始終從ar[0]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.