重复最后一次文件读取

时间:2013-11-11 00:26:22

标签: c

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的中间部分(字符串,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;

    }
}

2 个答案:

答案 0 :(得分:1)

解决问题的正确方法是测试输入操作;使用feof()是可能的但不是必需的,并且需要小心谨慎。您使用feof()显示的方式是wrong两种方式;你没有测试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()会保留换行符(除非输入行太长而无法容纳)。

答案 1 :(得分:0)

阅读手册页http://www.cplusplus.com/reference/cstdio/fgets/

可能是明智之举

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