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

时间:2017-05-09 15:23:44

标签: c file scanf

我是C语言编程的新手(这是我的第一语言),我不太擅长英语,对语法很抱歉......顺便说一句,我很想知道如果你能帮我这个: 我必须从文件中读取数组的组件,将它们设置为它的一部分,并在屏幕中将它们视为输出。 我用这个信息创建了一个文件:

  

罗西,马里奥,M 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(probabily)有一些问题,我想知道malloc是否使用正确......你能帮助我吗?我犯的错误在哪里?我该如何解决?代码应该如何使用fgets而不是fscanf?我是否以正确的方式使用定界符?

好的,非常感谢您的回复,我会用长变量处理10位数的电话号码,但我仍然不知道如何正确使用fscanf。这是第一次使用定界符,这让我很困惑。我的格式说明符是&#34;%s,%s,%s,%s,%ld,%s&#34;,对吧?但是我应该如何将它们放入fscanf?在参数&#34; file&#34;之后我要写什么?在fscanf?

1 个答案:

答案 0 :(得分:0)

{"val":"<data>","val":"<data>"}

您的格式说明符不正确;如果您告诉fscanf(file,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],[^\n]",... 要读取的数据是逗号分隔的,您使用括号内的逗号进行操作,则不需要指定放入的内容(fscanf),以及你缺少格式说明符。尝试在[^,]函数中提供fscanfprintf相同的格式。 小心:整数变量无法正确保存10位数的电话号码,使用stampa变量或将其视为字符串。

另一方面,long会将整行读入字符串缓冲区,因为它不接受格式说明符,因此最终只有一个字符串,包含整行,那么你应该使用与fgets相同的方式解析sscanf之类的内容。