带有分隔符的文件中的fgets和sscanf记录

时间:2017-06-01 15:23:17

标签: c record fgets scanf

我必须从文件中读取多条记录(记录的每个组成部分用逗号分隔),我无法理解问题是什么,所以这里是我的文件:

  

Rossi,Mario,M,mariorossi @ gmail.com,3923333332,Portiere Bianchi,Giuseppe,M,giuseppebianchi @ gmail.com,3470000021,Attaccante Ferrari,Anna,F,annaferrari @ gmail.com,3466482645,Attaccante Romano,安东尼奥,男,antonioromano @ gmail.com,3450394672,Centrocampista

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct dati_giocatori {
    char cognome[20];
    char nome[20];
    char genere[20];
    char email[50];
    char telefono[16];
    char ruolo[20];
};

typedef struct dati_giocatori GIOCATORE;

void stampa_file(FILE *pfile, GIOCATORE *vettore, int dim, char *stringa);

int main (){

    FILE *pfile;
    GIOCATORE *vettore;
    int dim=0;
    char stringa[200];


        printf("Quanti giocatori vuoi visualizzare?");
        scanf("%d",&dim);
        vettore=(GIOCATORE*)malloc(dim*sizeof(GIOCATORE));

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

        stampa_file(pfile,vettore,dim,stringa);
        system("pause");
        fclose(pfile);

        pfile=fopen("Giocatoriv.txt","r");
        system("pause");

        free(vettore);
        fclose(pfile);
        system("pause");

    return 0;
    system("pause");
}

void stampa_file(FILE *pfile, GIOCATORE *vettore, int dim, char *stringa){
    int i=0;
    int j=0;

    if(pfile!=NULL){
     if(!feof(pfile)){
        while(i<dim){
            if(!feof(pfile)){
                fgets(stringa,200,pfile);
                    sscanf(stringa,"%[^,],%[^,],%[^,],%[^,],%[^,],%s",vettore[i].cognome,vettore[i].nome,
                            vettore[i].genere,vettore[i].email,vettore[i].telefono,vettore[i].ruolo);
                i++;
                }
                else{
                    printf("\n----- Giocatori finiti -----\n");
                    printf("\n");
                    i=dim;
                }
            }
        }
     else{
         printf("\nFile finito.\n");
     }

    }
    else{
        printf("Errore nell'apertura del file.\n");
        printf("\n");
    }

     while(j<dim){
            printf("%s,%s,%s,%s,%s,%s\n",vettore[j].cognome,vettore[j].nome,
                  vettore[j].genere,vettore[j].email,vettore[j].telefono,vettore[j].ruolo);
            j++;
                    }   
    system("pause");
}

我知道问题在于sscanf(),因为它在屏幕上打印的只是每条记录的第一个组成部分,还有五个逗号,但我无法弄清楚如何解决这个问题......它没有将正确的数据分配到记录上的正确位置,sscanf()格式是否正确?我对分隔符不是很熟悉,我应该怎么解决这个问题?

感谢大家的帮助。对不起,你等了很长时间才得到回复,但我昨天无法编辑。我也非常抱歉发布错误,我是堆栈溢出的新手,我也是C的新手(这是我的第一语言)...(并且只是为了制作对我来说很难,我也不是一个母语人士,你可以通过我的语法错误注意到)。 是的,电子邮件地址是假的。 顺便说一下,老实说,我不知道在每条记录的末尾都检查文件是否有换行符......在写文件的过程中,我认为按下&#34;输入&#34;会给我一个换行符,但读你的评论我不再确定了。我想在每条记录的末尾使用换行符,但我该怎么做?这会使我的代码工作吗? (我第二次打开文件,因为我只是尝试了其他的东西,所以请不要介意,系统暂停也一样。)

1 个答案:

答案 0 :(得分:1)

好的,首先下次提出您的问题,特别是您的代码更具可读性(您必须正确使用缩进)。我不明白你为什么以错误的方式使用这么多type t = int * (unit -> t) list 。您还会投射system("pause");you should not do it的结果。你打开文件,然后使用它,关闭它并打开一个新文件,什么都不做,所以我删除了它。请注意,使用while (!feof(file)) is always wrong。然后在vettore=(GIOCATORE*)malloc(dim*sizeof(GIOCATORE));函数中我做了很多更改。

这是代码。

stampa_file

这是我用于测试的文件:

  

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