#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", ¤cy1) == EOF) break;
printf("%s %i\n", name[i].currency, name[i].exchangerate);
i++;
}
fclose(file);
}
它给出了分段错误(核心转储),我对fscanf函数等相当新。请帮忙! 我的文本文件如下所示: 杰夫4 吉娜5 杰弗里6 金娜7 杰夫8 吉娜娜9 jeffz 10
答案 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(....
}