2017-07-30 88 views
2

我一直試圖將此文本文件讀入結構數組中。這裏是幾行文字。將文本文件讀入結構數組C

A|Boston Red Sox|Fenway Park|4 Yawkey Way|Boston|MA|02215|(617) 267-9440|redsox.com 
N|St. Louis Cardinals|Busch Stadium|700 Clark Street|St. Louis|MO|63102|(314) 345-9600|cardinals.com 

這裏是結構數組。我修改了文本文件,只包含聯盟和團隊名稱,以便更容易地測試更改。

#define LEN_LINE 80 
#define LEN_NAME 30 
#define MAX_LINES 60 
#define LEAGUE_NAME 5 

typedef struct 
{ 
    char leagueName[LEAGUE_NAME + 1]; 
    char teamName[LEN_NAME + 1]; 


} team_t; 

這裏是哪裏出了問題lies.I試圖執行函數strncpy()雖然是一個初學者,已經很難試圖在這種情況下正確使用該功能。

FILE * filePtr; 
    int index, count; 
    char line[LEN_LINE + 1]; 
    team_t teams[MAX_LINES]; 
    filePtr = fopen("MLBteams.txt", "r"); 
    if(filePtr == NULL) 
    { 
     printf("Unable to open file.\n"); 
    } 
    else 
    { 
     index = 0; 
     while(index<MAX_LINES && fgets(line, LEN_LINE, filePtr)) 
     { 
      if(2 == sscanf(line,"%s %s", teams[index].leagueName, teams[index].teamName) 

       ) 
      { 
       index++; 
      } 
     } 
     fclose(filePtr); 

我通過其他線程看,雖然他們只是困惑我。

+0

的問題是,我需要在這些字裏行間的信息|從文本文件轉換爲獨立的結構成員。我的代碼的問題是它只會讀取這些行|例如,如果我想將Boston Red Sox閱讀成團隊[index] .teamName,它將只存儲波士頓。也感謝您的鏈接,我會嘗試分解代碼,看看它是否對我有幫助。 –

+0

這就像是一個特殊的說明符,它會讀取字符,直到遇到|。由於電話號碼/郵政編碼等信息不變,所以我可以將它們讀作字符串。無論如何,非常感謝您的幫助。 –

+1

在增加#define LEN_LINE的長度後,它完美地工作。謝謝 –

回答

0

從您的文本文件內容示例中可以看出,符號(A |波士頓紅襪隊)。你需要把它放在sscanf裏面:

if(2 == sscanf(line,"%s|%s", teams[index].leagueName, teams[index].teamName)) 
{ 
       index++; 
} 

好的。由於字符串中有空格,因此可以手動解析它並不難。取而代之的代碼abow做到這一點:

char *league_p = strchr(line,'|'); 
int len = league_p - line; 
char *league = calloc(len, 1); 
memcpy(league,line,len - 1); 
league_p++; 
char *team_p = strchr(league_p,'|'); 
len = team_p - league_p; 
char *team = calloc(len, 1); 
memcpy(team,league_p,len - 1); 

這樣,你總是會得到前兩個值分裂

+0

感謝您的幫助 –

+1

'2 == sscanf(行,「%s |%s」,...''總是會失敗,除非空格在前' ''在'行'中。 – chux