循环到文件末尾?

时间:2014-06-05 01:20:22

标签: c while-loop scanf

#include <stdio.h>
#include <stdlib.h>
//#define true 0

typedef struct
{
    char currency[8];
    int exchangerate;
} randT;


void main()
{
    int i, num;
    char currency1[8], ch;
    FILE *file = fopen("address", "r");

    randT name[7];

    while(fscanf(file, "%i", &name[i].exchangerate) != EOF)/*I think this is where my problem is*/
    {
        fscanf(file, "%s %i", &name[i].currency, &name[i].exchangerate);
        //printf("%s %i\n", currency1, num);
        //if (fscanf(file, "%i", &currency1) == EOF) break;
        printf("%s %i\n", name[i].currency, name[i].exchangerate);
        i++;
    }

    fclose(file);
}

它给出了分段错误(核心转储),我对fscanf函数等相当新。请帮忙! 我的文本文件如下所示: 杰夫4 吉娜5 杰弗里6 金娜7 杰夫8 吉娜娜9 jeffz 10

1 个答案:

答案 0 :(得分:1)

崩溃的原因是您需要初始化int i = 0;。如你所知,i是不确定的,因此name[i]可能是一个大规模的越界访问。

对于fscanf,您对循环大多是正确的想法,除了检查!= EOF之外,最好检查== 1或您正在阅读的项目。如果文件包含无法作为数字处理的内容,则fscanf将不会返回EOF

但是,这不是阅读特定文件的正确方法。您每次都阅读%i然后%s %i,但您的文件只包含字符串和int。改为:

while ( 2 == fscanf(file, "%7s %i", name[i].currency, &name[i].exchangerate) )

在执行i++之后,您还需要检查i是否已超出范围(即小于7)。

请注意,name[i].currency衰减到指向char的指针 - 您不应该在其上放置&。您还应该使用长度说明符来避免在数组末尾运行。

我会使用循环结构:

for (num_read = 0; num_read < sizeof name / sizeof name[0]; ++num_read)
{
     if ( 2 != fscanf(file,.....
         break;

     printf(....
}