将fscanf传递给struct

P3d*_*h77 1 c

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

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

ins*_*ity 5

首先,当你只传递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文件作为输入.

  • @ P3druh77如你所见,我在`main()`函数内循环.是你做的吗?还有什么'n_p大小?你能告诉我们你剩下的代码吗? (2认同)