如何正确使用fscanf和fgets从文件中读取

问题描述:

我是C编程新手(这是我的第一语言),我不擅长英文,所以对于语法感到抱歉...顺便说一句,我想知道你是否可以帮助我: 我必须从文件中读取数组的组件,将它们设置为它的一部分,并将它们看作屏幕上的输出。 我创建了这个信息文件:如何正确使用fscanf和fgets从文件中读取

罗西,马里奥,男,mariorossi @ gmail.com,3923333332,门帘 比安奇,朱塞佩,男,giuseppebianchi @ gmail.com,3470000021,Attaccante 法拉利,安娜,F,annaferrari @ gmail.com,3466482645,Attaccante 罗马诺,安东尼奥,男,antonioromano @ gmail.com,3450394672,Centrocampista

,并试图编码我结束了与此:

#include <stdio.h> 
    #include <stdlib.h> 
    struct dati_giocatori { 
     char cognome[20]; 
     char nome[20]; 
     char genere[20]; 
     char email[20]; 
     int telefono; 
     char ruolo[20]; 
    }; 

    typedef struct dati_giocatori GIOCATORE; 

    void lettura(FILE *file, GIOCATORE *vettore, int dim); 
    void stampa(GIOCATORE *vettore, int dim); 

    int main(){ 
     FILE *file; 
     GIOCATORE *vettore; 
     int dim; 

     vettore=(GIOCATORE*)malloc(dim*sizeof(GIOCATORE)); 
     printf("how many players do you want to see?"); 
     scanf("%d",&dim); 


     file=fopen("Giocatori.txt","r"); 

     lettura(file,vettore,dim); 
     stampa(vettore,dim); 

     system("pause"); 
     return 0; 

    } 

    void lettura(FILE *file, GIOCATORE *vettore, int dim){ 
     int i=0; 
     if(file){ 
       while(!feof(file) && i<dim){ 
        fscanf(file,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],[^\n]", vettore[i].cognome,vettore[i].nome,vettore[i].genere,vettore[i].email,&vettore[i].telefono,vettore[i].ruolo); 
       i++; 
       } 
      } 
      else{ 
       printf("Error."); 
      } 
    } 


    void stampa(GIOCATORE *vettore, int dim){ 
     int i=0; 
     while(i<dim){ 
      printf("%s,%s,%s,%s,%d,%s\n", vettore[i].cognome,vettore[i].nome,vettore[i].genere,vettore[i].email,vettore[i].telefono,vettore[i].ruolo); 
     i++; 
     } 
    } 

但它不工作得很好。我知道我对fscanf有一些问题(可能),并且我想知道malloc是否被正确使用了...你能帮助我吗?我犯的错误在哪里?我该如何解决它们?代码应该如何使用fgets而不是fscanf?我是否以正确的方式使用分隔符?

好的,非常感谢你的回复,我会用一个长变量来对待这个10位数的电话号码,但是我仍然不知道如何正确使用fscanf。这是第一次使用分隔符,这让我感到困惑。我的格式说明符是“%s,%s,%s,%s,%ld,%s”,对吗?但我应该如何将它们放入fscanf?我在fscanf的参数“file”之后写什么?

+1

您不能对'int'使用'%[^,]'。所以E.g'int telefono;' - >'char telefono [16];' – BLUEPIXY

+1

是的,将电话号码存储为字符串。常规的32位带符号整数不能保存您的电话号码:3,450,394,672大于2 3¹= 2,147,483,648。 –

+0

非常感谢你的答复,我得到了“int telefono”的问题,但我仍然没有得到正确的形式fscanf与demitators,我应该在第一个参数“文件”的fscanf? – Varkas

fscanf(file,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],[^\n]",... 

您的格式说明符不正确;如果您告诉fscanf要读取的数据是用逗号分隔的,您使用括号外的逗号进行读取,则不需要指定放入的内容([^,]),并且缺少格式说明符。尝试提供fscanfstampa函数中给出的printf相同的格式。 小心:整数变量不能正确保存10位数的电话号码,请使用long变量或将它当作字符串来对待。

另一方面,fgets会将整行读入字符串缓冲区,因为它不接受格式说明符,因此您最终只能得到一个包含整行的字符串,然后您应该用就像sscanf一样,你应该使用fscanf

+0

好的,非常感谢你的回复,我会用一个长变量来处理这个10位数的电话号码,但我仍然不知道如何正确使用fscanf。这是第一次使用分隔符,这让我感到困惑。 我的格式说明符是“%s,%s,%s,%s,%ld,%s”,对吧?但我应该如何将它们放入fscanf?我在fscanf的参数“file”之后写什么? – Varkas

+0

原型是'int fscanf(FILE * stream,const char * format,...)',其中'const char * format'是一个包含说明符的字符串和相关目标变量的列表;例如:'fscanf(stdin,“%d”,&myInt)'从stdin中读取一个整数并保存到'myInt'中。在你的情况下,它将是'fscanf(文件,“%s%s%s%ld%s”,vettore.nome,vettore.cognome,...)''。请注意,两个格式说明符之间的空格告诉'fscanf',希望每个字符串/数字之间的空格都被读取。 –