fgets() 在 for 循环中工作错误

fgets() works wrong in for loop

我正在尝试使用 fgetsfputs 复制粘贴文件。我写了两种方式,一种是for循环,另一种是while循环。 while 循环运行完美,但是 for 循环行为很奇怪。

我试着调试并写了这个:

FILE *infile = fopen("infile", "r");
FILE *outfile = fopen("forLoop_outfile", "w");
int row = 6, len = 6;
char *readbuf = malloc(len * sizeof(char));
for (int i = 0; i < row; i++)
{
    printf(" %d ", i);
    if (fgets(readbuf, len, infile) == NULL)
       perror("fgets");
    if (fputs(readbuf, outfile) == -1)
       perror("fputs");
    if (fputs(readbuf, stdout) == -1)
       perror("fputs");
}

输入文件:

abcde
fghij
klmno
pqrst
uvwxy
z

标准输出和输出文件相同:

 0 abcde 1 
 2 fghij 3 
 4 klmno 5 

如您所见,仅读取前 3 行,并且每 2 次迭代都会出错。而且调试似乎没用。

怎么了?

实际上输入文件包含

abcde\n
fghij\n
klmno\n
pqrst\n
uvwxy\n
z\n

由于动态分配数组的长度等于 6,因此 fgets 的第一次调用只读取 5 个字符 "abcde" 并在它们后面附加终止符零字符 '[=15=]'。换行符 '\n' 尚未读取。所以 fgets 的下一次调用读取这个换行符 '\n'.

要解决此问题,请增大动态分配数组的大小。

int row = 6, len = 10;
char *readbuf = malloc(len * sizeof(char));
for (int i = 0; i < row; i++)
{
    printf(" %d ", i);
    if (fgets(readbuf, len, infile) == NULL)
    {
       perror("fgets");
       break;
    }
    if (fputs(readbuf, outfile) == -1)
       perror("fputs");
    if (fputs(readbuf, stdout) == -1)
       perror("fputs");
}

您的 len 太小了,因为您的末尾还有 '\n' 字符。 读取新行失败需要停止执行