将fscanf传递给struct

时间:2011-05-10 21:06:21

标签: c

我正在尝试打开一个文件并传递给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 ??

另一个问题是如何分隔类似的文件,但用“;”

2 个答案:

答案 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 []数组的索引。

此外,希望你有一个足够大的人员阵列来保存文件中的所有条目。