解析具有多个公共分隔符C的文件

时间:2015-01-12 05:47:49

标签: c parsing command-line text-files

我正在使用C语言中的基本命令行音乐库,它允许您通过命令行打开文件,并添加艺术家,歌曲标题和发布年份等信息。一旦退出,它就会将该信息写回同一个文件中。

我遇到的问题是尝试找到正确解析文本文件的解决方案。

例如,输入文件将如下所示:

Title: Heirloom, Artist: Basenji, Year Published: 2014
Title: With Me, Artist: Cashmere Cat, Year Published: 2014

我正在研究的项目指出(违反惯例)我们在struct Song中存储了一行信息,如下所示:

struct Song {
    char title[250];
    char artist[250];
    int year_published;
};

每个Song都存储在struct Song类型的数组中,名为music_lib[]

我知道如何通过执行以下操作将每一行分成一个特定的struct Song

while(fscanf(input_file, "%s %s %ld", *temp_title, *temp_artist, *temp_year) != EOF)
    copy_song_to_music_library(temp_title, temp_artist, temp_year);

我不知道如何正确解析文本文件,以便在我有一个已知的格式时:

Title: Heirloom, Artist: Basenji, Year Published: 2014

对于我的标题变量,我得到“传家宝”(和标题:被删除),对于我的艺术家变量,我得到“Basenji”(与艺术家:剥离),而我的年变量我得到2014年(与发表年份:剥离出来。)

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:4)

您需要更改

while(fscanf(input_file, "%s %s %ld", *temp_title, *temp_artist, *temp_year) != EOF)

while(fscanf(input_file, "Title: %s, Artist: %s, Year Published: %ld", *temp_title, *temp_artist, *temp_year) != EOF)

此外,您需要检查fscanf()的返回值以确保正确阅读。

来自fscanf()

man page
  

。 。 。返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

一些相关参考:

此(和家庭)功能的签名是

int fscanf(FILE *stream, const char *format, ...);

其中,const char *format被描述为

  

format 字符串由一系列指令组成,这些指令描述了如何处理输入字符序列。

format的预期格式是[强调我的]

  

指令是以下之一:

     

•一系列空格字符(空格,制表符,换行符等;请参阅isspace(3))。该指令在输入中匹配任意数量的空格,包括无空格。

     

•普通字符(即除了空格或'%'之外的字符)。此字符必须与输入的下一个字符完全匹配。

     

•转换规范,以'%'开头。 (百分比)字符。根据此规范转换输入中的字符序列,并将结果放在相应的指针参数中。如果下一项输入与转换规范不匹配,则转换失败 - 这是匹配失败。

注:

但是,为了使其更通用,我建议使用fgets()来获取输入,然后使用strtok()来标记输入和使用。