我正在尝试打开一个文件并传递给struct
,我正在使用带有循环的fscanf()
,但它只保存了最后一次读取的struct
:
想象一个文件:
JR John Rambo 24353432
JL John Lennon 6435463
我正在使用此代码:
typedef struct people{
char code[10];
char name[100];
long telephone;
}PEOPLE;
int read(PEOPLE people[], int n_p){
char temp;
FILE *fp;
fp=fopen("example.txt","r");
if(fp==NULL){
printf("Error\n");
return -1;
}
while(!feof(fp)){
fscanf(fp,"%s %s %s %d\n", people[n_p].code,people[n_p].name,
&people[n_p].telephone);
}
}
问题是他只保存文件的最后一行......我应该做一个if cicle ??
另一个问题是如何分隔类似的文件,但用“;”
答案 0 :(得分:5)
首先,当您在%s
中仅传递3个参数时,您正在扫描3个字符串(%d
)和1个int fscanf()
)。您可以在char first_name[50];
中添加struct
,然后执行:
fscanf(fp,"%s %s %s %d\n", people[n_p].code,people[n_p].first_name,
people[n_p].name, &people[n_p].telephone);
你总是fscanf()
该文件,直到你没有其他东西可读(由于!feof(fp)
由于while而导致。所以在最后people[n_p]
变量中,文件的最后一行将是得救。
您可以从while
中删除read()
,并将FILE *
作为参数添加到该函数中,这样每次调用{{1}时都不会打开文件}。
这样的事情可能是:
read()
要将main()
{
FILE* fp = fopen("example.txt", "r");
int i = 0;
while (!feof(fp)) {
read(people, i, fp);
i++;
}
}
int read(PEOPLE people[], int n_p, FILE* fp){
char temp;
if(fp==NULL){
printf("Error\n");
return -1;
}
fscanf(fp,"%s %s %s %d\n", people[n_p].code,people[n_p].first_name,
people[n_p].name, &people[n_p].telephone);
}
用作分隔符,您可以将;
更改为:
fscanf()
编辑我编写了上面的代码here,并且可以使用此example.txt file作为输入。
答案 1 :(得分:3)
看起来你没有改变n_p变量。您需要某种变量来跟踪您正在更新的people []数组的索引。
此外,希望你有一个足够大的人员阵列来保存文件中的所有条目。