我在用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)然后解析它。