2011-05-10 61 views
1

我试图打开一个文件,并传递给struct,我使用fscanf()有一个循环,但只保存一个struct最后一次读:传递的fscanf为结构

试想一个文件:

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); 
    } 
} 

的问题是,他只保存文件的最后一行...如果我做了,如果cicle?

另一个问题是,我怎么能分开的类似文件,但使用“;”

+3

N_P不会改变,也许你忘了增加呢? – Thomas 2011-05-10 21:11:18

回答

5

首先,当您在fscanf()中仅传递3个参数时,您正在扫描3个字符串(%s)和一个int(%d)。你可以在你的struct添加char first_name[50];然后执行:

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)因为虽然如此,在过去people[n_p]变量的最后一行。的文件将被保存。

你可以从read()删除while,也可以作为参数添加到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); 

} 

对于使用;作为分隔符可以改变fscanf()这样:

fscanf(fp, "%[^;]; %[^;]; %d\n", people[n_p].code,people[n_p].name, 
      &people[n_p].telephone); 

编辑我写上面的代码中可以发现here,它以这个example.txt file作为输入正常工作。

+0

如果我不循环使用,而正如你所看到的'主()'函数中我圈,他不仅节省了第一...感谢 – P3druh77 2011-05-10 21:23:58

+2

@ P3druh77。是你做的吗?还有什么'n_p大小?你能告诉我们你的其他代码吗? – insumity 2011-05-10 21:27:18

3

它看起来就像你不改变N_P变量。您需要某种变量来跟踪您正在更新的people []数组的哪个索引。

另外,希望你有一个足够大的人数组来保存文件中的所有条目。

+0

我知道问题是索引,但我已经尝试做,但是是一样的; – P3druh77 2011-05-10 21:28:33

+1

@ P3druh77:它告诉我们什么都没有。如果戴安的建议不起作用,您需要告诉我们您尝试了什么以及发生了什么。 – 2011-05-10 21:32:39

+0

@ P3druh77我在说的是你需要用n_p做点什么。平等的答案有一些应该帮助的代码。 – thedaian 2011-05-10 21:42:11