我正在尝试打开一个文件并传递给struct我,我正在使用fscanf()循环,但它只保存struct最后一次读取:
想象一个文件:
JR John Rambo 24353432
JL John Lennon 6435463
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是他只保存文件的最后一行......我应该做一个if cicle吗?
另一个问题是我如何分隔一个类似的文件,但用";"
首先,当你只传递3个参数时,你正在扫描3个字符串(%s)和一个int(%d)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);
Run Code Online (Sandbox Code Playgroud)
你总是fscanf()把文件直到你没有更多的东西要阅读(由于时间的!feof(fp)原因.因此在最后一个people[n_p]变量中,文件的最后一行将被保存.
您可以删除whilefrom read()并将该FILE *参数作为参数添加到该函数中,这样您每次调用时都不会打开该文件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);
}
Run Code Online (Sandbox Code Playgroud)
要使用;作为分隔符,您可以更改fscanf()为:
fscanf(fp, "%[^;]; %[^;]; %d\n", people[n_p].code,people[n_p].name,
&people[n_p].telephone);
Run Code Online (Sandbox Code Playgroud)
编辑我写了上面的代码,可以在这里找到,它可以正常使用这个example.txt文件作为输入.