我需要解析一个包含以下内容的文本文件:
1|Song Title|Release date||"ignore me"|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0
Run Code Online (Sandbox Code Playgroud)
这是歌曲编号,然后是发行日期,接下来是我需要忽略的网站,然后是一系列0和1,它们可以代表流派的矢量.
我需要一种方法来分离这些数据,并忽略那个说网站的同时创建一个Song对象的新实例,它具有:(int songNumber,string songTitle,vector*genres,string releaseDate)
谢谢!
小智 16
在C++字符串工具箱库(StrTk)具有以下问题的解决方案:
#include <string>
#include <deque>
#include "strtk.hpp"
struct song_type
{
unsinged int id;
std::string release_date;
std::string url;
char genre[8];
};
strtk_parse_begin(song_type)
strtk_parse_type(id)
strtk_parse_type(release_date)
strtk_parse_type(url)
strtk_parse_type(genre[0])
strtk_parse_type(genre[1])
strtk_parse_type(genre[2])
strtk_parse_type(genre[3])
strtk_parse_type(genre[4])
strtk_parse_type(genre[5])
strtk_parse_type(genre[6])
strtk_parse_type(genre[7])
strtk_parse_end()
int main()
{
std::deque<song_type> song_list;
strtk::for_each_line("songs.txt",
[&song_list](const std::string& line)
{
song_type s;
if (strtk::parse(line,"|",s))
song_list.push_back(s);
});
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更多例子可以在这里找到
Song,以您需要的形式保存数据,如上所述Song::operator>>(const istream&);通过从输入流解析上述数据来填充类string::getlinestringstream,然后使用您operator>>填写 的实例中的字段Song。使用“|”标记字符串流非常简单 字符作为分隔符,这将是大部分工作。
int main()
{
std::string token;
std::string line("1|Song Title|Release date||\"ignore me\"|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0");
std::istringstream iss(line);
while ( getline(iss, token, '|') )
{
std::cout << token << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码从这里解除。