C-FGET如何处理多个调用

C-FGET如何处理多个调用,c,file,fgets,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++; } inti=0; char-ar[500]; 而(i

我有以下代码:

int i = 0;
char ar[500];

while(i < 20)
{
    printf("Type a line: ");
    fgets(ar, 500, stdin);
    fprintf(fp,"%s", ar);
    i++;
}
inti=0;
char-ar[500];
而(i<20)
{
printf(“类型a行:”);
fgets(ar、500、标准DIN);
fprintf(fp,“%s”,ar);
i++;
}

基本上,我尝试打开一个文件,然后从用户那里获取20行输入并将其存储在一个数组中,然后将其打印到文件中。它工作得很好,但我不明白fgets在while循环中是如何工作的。据我所知,当i=0时,fgets将第1行存储到ar[500],fprintf将其打印到文件中;当i=1时,fgets将第2行存储到ar[500],但现在ar[500]有2行,但为什么fprintf仅将第2行打印到文件中,而不是将所有2行打印到文件中,依此类推。fgets总是在arr[0]处开始填充数组. 在每次迭代中,上一行被覆盖。fgets将在arr中为您添加空终止字符,因此只有当前读取的行将输出到fp指向的文件。

每次都将覆盖缓冲区
ar


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

字符*fgets(字符*restrict s,int n,文件*restrict stream)的描述; 是:

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

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

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

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

char ar[20][500];
然后读入
ar[i]

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

否,函数
fgets()
不追加

相反,它是重叠的


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

读取while循环:while(fgets(ar,500,fp))put(ar);要读取文件,每次fgets读取时,它都会返回下一行(就像第一次一样,fgets读取第一行的文件并将其打印到屏幕上,第二次,它返回第二行,将其打印到屏幕上,依此类推)。你知道fgets是如何记住它放在哪里的吗。@ThuanNguyen
fgets
不记得,但是
FILE
s有一个固有的机制——在读取文件时向前移动。