解析文本文件,创建新对象c ++的实例

Edw*_*ard 13 c++

我需要解析一个包含以下内容的文本文件:

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)

更多例子可以在这里找到


Ste*_*end 4

  • 定义一个类Song,以您需要的形式保存数据,如上所述
  • 实现Song::operator>>(const istream&);通过从输入流解析上述数据来填充类
  • 使用逐行读取文件string::getline
  • 对于每一行,转换为stringstream,然后使用您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)

代码从这里解除。