我在用C编写一个项目,在这个项目中,我使用fgets()从一个文件中读取行。每个文件的格式如下:

Title: Name Here, Artist: Artist Here, Year Published: 2014

目前我把上面的行存储为一个字符串。问题是,我有一个名为music_lib的结构数组,其类型为Song,如下所示:
struct Song
{
    char title[250];
    char artist[250];
    int year_published;
};

我希望能够拆分我拥有的字符串,并将Name Here存储在title中,将Artist Here存储在artist中,并将2014存储在year_published中,同时丢弃从文件中获取的其余字符串。
我已经看过了strtok(),但似乎很难,因为我想忽略Title:和其他单词,以及逗号。有没有一种简单的方法可以让我猜到找到一个子串Title:,将其后的内容存储到逗号,然后找到子串Artist:,将所有内容存储到逗号。。然后对Year Published做同样的事情?

最佳答案

使用sscanf()"%[]"(用于标题和艺术家)和"%n"查找结尾将解析缓冲区。

struct Song songa;
int n = 0;
int cnt = sscanf(buf,
    " Title: %249[^,], Artist: %249[^,], Year Published: %d %n",
    songa.title, songa.artist, &songa.year_published, &n);
if (cnt == EOF) Handle_EOF();
if (n > 0 && buf[n] == '\0') Success();
else Handle_BadBuffer();

格式分解" Title: %249[^,], Artist: %249[^,], Year Published: %d %n"
" "使用可选的前导空格。
"Title:"使用“标题:”。
" "使用可选空白。
"%249[^,]"扫描并将249个非-','char保存到.title中。附加'\0'
", Artist:"消费“,艺术家:“。
" "使用可选空白。
"%249[^,]"扫描并将249个非-','char保存到.artist中。附加'\0'
","消耗“,”。
" "使用可选空白。(这里不需要)
"%d"扫描并将int保存到.year_published中。
" "使用可选空白。(捕获\n)
"%n"正在进行buf扫描的保存当前偏移量。
n仅在扫描结束时设置。所以非零值表示成功。它应该索引到字符串的末尾。
[编辑]
我现在看到asimilar post。最好不要在这里讨论的fscanf()方法中使用这种格式。
只要文件中的数据是面向行的,首先要考虑的是fgets()getline()是否有它。这里的格式可能会被'\n'愚弄,或者嵌入到意想不到的地方。所以最好是1)阅读这一行,2)然后解析它。

10-01 17:30