2017-05-09 225 views
0

我是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

回答

0
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',希望每個字符串/數字之間的空格都被讀取。 –