C-fgets如何与多个电话一起使用

时间:2018-07-16 05:24:11

标签: c file fgets

我有以下代码:

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行,依此类推。

4 个答案:

答案 0 :(得分:4)

fgets总是开始在arr [0]处填充数组。在每次迭代时,前一行将被覆盖。 fgets将在arr中为您添加空终止符,因此仅当前读取的行将输出到fp所指向的FILE。

答案 1 :(得分:4)

char *fgets(char * restrict s, int n, FILE * restrict stream); 的描述为(C11 7.21.7p2)

  

2 fgets函数从stream指向的流到n指向的数组中读取的字符数最多少于s指定的字符数。在换行符(保留)或文件结束之后,不会读取其他字符。在将最后一个字符读入数组后,立即写入空字符。

fgets读取的第一个字符将始终存储在s[0]中,依此类推,直到最多s[n - 1]或遇到的第一个换行符(它是最后存储的字符)。读取的最后一个字符之后的元素将设置为'\0',从而终止该字符串。

即实际上,fgets调用将覆盖数组中的k + 1个第一个元素,其中k是行的长度或n(以较小者为准),而1表示空终止。

要存储20行,您需要一个数组数组:

char ar[20][500];

然后读入ar[i]

答案 2 :(得分:3)

缓冲区ar每次都会被覆盖。

fgets具有原型char *fgets(char *str, int n, FILE *stream)。它将从n-1中读取最多stream个字符并将它们写入str,然后添加'\0'字符。

答案 3 :(得分:0)

关于:“但是ar [500]现在有2行,”

否,函数fgets()不附加。

相反,它会覆盖。

在发布的代码中,始终从ar[0]开始