gpt4 book ai didi

c - 为什么 fgets 不在 while 循环中读取整行但在 for 循环中工作?

转载 作者:太空宇宙 更新时间:2023-11-04 09:46:47 25 4
gpt4 key购买 nike

如果我的 fgets 在 while 循环中,它只返回一半的字符串。如果它在 for 循环中,它会返回整个字符串。知道为什么吗?

代码如下:

    FILE *fp; // File pointer
char filename[] = "results.tsv";
fp = fopen(filename, "r"); // Open file argv[1] for READ


char s[4096];

int num = atoi(fgets(s, sizeof(s), fp)); // Get first line (number of units in file)

int i;
for(i = 0; i < num; i++)
{
printf("%s", fgets(s, sizeof(s), fp)); // Prints everything
}


while (fgets(s, sizeof(s), fp) != NULL) // Loop until no more lines
{
printf("%s\n", s); // Only prints the x's
}

fclose(fp); // Close file

和文件内容:

1
xxxxxxxx yyyy eee

大空格是制表符 (\t)。

如果我运行它,我得到:

仅用于循环:

xxxxxxxx       yyyy       eee

仅 While 循环:

xxxxxxxx

谢谢。

最佳答案

正如已经诊断的那样,您的代码“对我有用”。这是我为其创建的 SSCCE。如果不带参数调用,它使用 while 循环。如果使用任何参数调用,它使用 for 循环。无论哪种方式,它都适合我。请注意,代码不直接使用 fgets() 的返回值;在这样做之前,它会检查输入操作是否成功。它还反射(reflect)了它正在做的事情和正在阅读的内容。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
FILE *fp;
char filename[] = "results.tsv";

if ((fp = fopen(filename, "r")) == 0)
{
fprintf(stderr, "%s: failed to open file %s\n", argv[0], filename);
exit(1);
}

char s[4096];

if (fgets(s, sizeof(s), fp) == 0)
{
fprintf(stderr, "Premature EOF\n");
exit(1);
}

int num = atoi(s);
printf("Num lines: %d\n", num);

if (argc > 1)
{
printf("For loop:\n");
for (int i = 0; i < num; i++)
{
if (fgets(s, sizeof(s), fp) == 0)
{
fprintf(stderr, "Premature EOF\n");
exit(1);
}
printf("%d: %s", i+1, s);
}
}
else
{
int i = 0;
while (fgets(s, sizeof(s), fp) != NULL)
{
printf("While loop:\n");
printf("%d: %s", ++i, s);
}
}

fclose(fp);

return 0;
}

如果您使用此代码但它在您的系统上失败,那么您可以提交您的证据。除其他外,您应该确定您正在使用的平台,并且您应该在文件 results.tsv 中提供数据的十六进制转储(或等效)。例如,我使用的数据文件包含字节:

0x0000: 31 0A 78 78 78 78 78 78 78 78 09 79 79 79 79 09   1.xxxxxxxx.yyyy.
0x0010: 65 65 65 65 0A eeee.
0x0015:

关于c - 为什么 fgets 不在 while 循环中读取整行但在 for 循环中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15567823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com