gpt4 book ai didi

c - 解析具有多个公共(public)分隔符的文件 C

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:14 25 4
gpt4 key购买 nike

我正在使用 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);

我不知道该怎么做的是如何正确解析文本文件,以便当我有已知格式时:

标题:传家宝,艺术家:Basenji,出版年份:2014

对于我的标题变量,我得到“Heirloom”(并且 Title: 被删除),对于我的艺术家变量,我得到“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() 的返回值以确保正确读取。

来自man page fscanf()

. . . return the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure.

一些相关引用:

这个(和家族)函数的签名是

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

其中,const char *format描述为

The format string consists of a sequence of directives which describe how to process the sequence of input characters.

format 的预期格式是 [emphasis mine]

A directive is one of the following:

• A sequence of white-space characters (space, tab, newline, etc.; see isspace(3)). This directive matches any amount of white space, including none, in the input.

• An ordinary character (i.e., one other than white space or '%'). This character must exactly match the next character of input.

• A conversion specification, which commences with a '%' (percent) character. A sequence of characters from the input is converted according to this specification, and the result is placed in the corresponding pointer argument. If the next item of input does not match the conversion specification, the conversion fails-this is a matching failure.

注意:

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

关于c - 解析具有多个公共(public)分隔符的文件 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27896004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com