我正在使用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年(与发表年份:剥离出来。)
有一种简单的方法吗?
答案 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()
。 。 。返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。
一些相关参考:
此(和家庭)功能的签名是
int fscanf(FILE *stream, const char *format, ...);
其中,const char *format
被描述为
format 字符串由一系列指令组成,这些指令描述了如何处理输入字符序列。
format
的预期格式是[强调我的]
指令是以下之一:
•一系列空格字符(空格,制表符,换行符等;请参阅isspace(3))。该指令在输入中匹配任意数量的空格,包括无空格。
•普通字符(即除了空格或'%'之外的字符)。此字符必须与输入的下一个字符完全匹配。
•转换规范,以'%'开头。 (百分比)字符。根据此规范转换输入中的字符序列,并将结果放在相应的指针参数中。如果下一项输入与转换规范不匹配,则转换失败 - 这是匹配失败。
注:
但是,为了使其更通用,我建议使用fgets()
来获取输入,然后使用strtok()
来标记输入和使用。