【问题标题】:Reading text file into array of structures C将文本文件读入结构数组 C
【发布时间】:2017-07-30 22:21:27
【问题描述】:

我一直在尝试将这个文本文件读入结构数组。这是文本中的几行。

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;

这就是问题所在。我尝试过实现 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);  

我查看了其他线程,虽然它们只是让我感到困惑。

【问题讨论】:

  • 问题是我需要阅读这些行之间的信息 |从文本文件转换成单独的结构成员。我的代码的问题是它只会读取这些行 |例如,如果我想将 Boston Red Sox 读入 teams[index].teamName ,它只会存储 Boston。也感谢您的链接,我会尝试分解代码,看看它是否对我有帮助。
  • 所以这就像一个特殊的说明符,它读取字符直到它遇到|。由于电话号码/邮政编码等信息是恒定的,我可以将它们作为字符串读取。无论如何,非常感谢您的帮助。
  • 增加#define LEN_LINE 的长度后,它工作得很好。谢谢

标签: c arrays structure


【解决方案1】:

从您的文本文件内容示例中,您有一个拆分器为 |符号(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);

这样你总是会得到前两个值的拆分

【讨论】:

  • 感谢您的帮助
  • 2 == sscanf(line,"%s|%s", ... 将始终失败,除非line 中的| 前面有一个空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2021-02-25
  • 1970-01-01
相关资源
最近更新 更多