2017-07-30 85 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