我正在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
来说是一样的吗?
答案 0 :(得分:3)
使用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
。因此,非零值表示成功。并且它应该索引到字符串的末尾。
[编辑]
我现在看到similar post。使用此处讨论的fscanf()
方法不使用此格式是件好事。
文件中的任何时候数据都面向行,首先考虑的是fgets()
或getline()
。此处的格式可能会在意外的地方被'\n'
或嵌入式'\0'
所欺骗。所以最好1)读取行,2)然后解析它。