我正在使用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年(发布年份:剥离出来)。
是否有捷径可寻?
你需要改变
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()
的手册页
。 。 。 返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。
一些相关的参考:
这个(和家庭)function的签名是
int fscanf(FILE *stream, const char *format, ...);
其中, const char *format
被描述为
格式字符串由一系列指令组成,这些指令描述了如何处理输入字符序列。
格式的预期格式是[强调我的]
指令是以下之一:
•一系列空格字符(空格,制表符,换行符等;请参阅isspace(3))。 该指令匹配输入中的任何数量的空白区域,包括无空格。
•普通字符(即除空格或’%’以外的字符)。 此字符必须与输入的下一个字符完全匹配。
•转换规范,以’%’(百分号)字符开头。 根据此规范转换输入中的字符序列,并将结果放在相应的指针参数中。 如果下一项输入与转换规范不匹配,则转换失败 – 这是匹配失败。
注意:
但是,为了使其更通用,我建议使用fgets()
来获取输入,然后使用strtok()
来标记输入和使用。
以上就是c/c++开发分享解析具有多个公共分隔符C的文件相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519464.html