-1
int k;
char string[100];
    for(k = 0; k < MAX_STATIONS; k++){
        fgets(string,100,fp);
        printf("%s", string);
    }

所以我在这里截取了代码,当我尝试从文件中打印文本时,最后一行可能会重复 10 次。

195     11.00  2013 11 02 15 32   49.76668  234.97289    30
196     11.40  2013 11 02 15 32   49.70103  235.04120    30
197      7.30  2013 11 02 15 32   48.52185  236.57961     5
199     10.00  2013 11 02 15 32   48.39511  236.69492     5
200      8.50  2013 11 02 15 32   48.48800  236.67270     5  200      8.50  2013 11 02     15 32   48.48800  236.67270     5  200      8.50  2013 11 02 15 32   48.48800  236.67270     5  200      8.50  2013 11 02 15 32   48.48800  236.67270     5  200      8.50  2013 11 02 15 32   48.48800  236.67270     5

这是我的输出,任何帮助将不胜感激。另外,我想澄清一下,我们如何处理 fgets(string,100,fp) 的中间部分(在本例中为 100)。

谢谢

编辑:我似乎通过添加解决了这个问题

if(feof(fp)) break;

这是一个有效的解决方案吗?

EDIT2:我还通过放置一个while循环来检查它是否已经到达forloop中流的末尾来解决它:

int k;
char string[100];

for(k = 0; k < MAX_STATIONS; k++){
    while(!feof(fp)){
        fgets(string,100,fp);
        printf("%s", string);
        //if(feof(fp)) break;

    }
}
4

2 回答 2

1

解决的正确方法是测试输入操作;使用feof()是可能的,但不是必需的,并且需要小心才能正确使用。您展示的使用方式在两个方面feof()错误的;您没有测试 I/O 操作,而是引入了一个循环,该循环会吃掉您的整个输入,k == 0而不会为后续行留下任何内容。

int k;
char string[100];
for (k = 0; k < MAX_STATIONS; k++)
{
    if (fgets(string, sizeof(string), fp) == 0)
        break;
    printf("%d: %s", k, string);
}

或者:

int k;
char string[100];
for (k = 0; k < MAX_STATIONS && fgets(string, sizeof(string), fp) == 0; k++)
    printf("%d: %s", k, string);

请注意,fgets()保留换行符(除非输入行太长而无法容纳)。

于 2013-11-11T00:33:39.347 回答
0

也许阅读手册页http://www.cplusplus.com/reference/cstdio/fgets/可能是明智的

如果返回的值可能表明文件已用完

于 2013-11-11T00:33:04.543 回答