fgets() 在 for 循环中工作错误
fgets() works wrong in for loop
我正在尝试使用 fgets
和 fputs
复制粘贴文件。我写了两种方式,一种是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' 字符。
读取新行失败需要停止执行
我正在尝试使用 fgets
和 fputs
复制粘贴文件。我写了两种方式,一种是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' 字符。
读取新行失败需要停止执行