从文本文件中读取,存储数据的最佳方式C++



Basicly我有一个文本文件,我不需要读入值,这样程序就可以操作它们。

我使用C++,我已经编写了工作代码来判断文件是否存在。

文本文件的格式如下:

1    7
8    10
20   6
3    14
...

左边的值是X值,右边的值是Y值。(中间的空格是一个制表符)如何提取这些数据?说让他们进入这样的班级。。。

myVector(X,Y);

另外,我想在类中使用它之前,我必须TryParse将它从字符串更改为int,对吗?C++能做到这一点吗?

谢谢!

如果我是你,我会写这样的东西。注意,这只是原型代码,甚至还没有经过测试。

基本思想是在一行中读两次,但使用不同的分隔符。您将首先使用制表符进行读取,然后仅使用默认的行尾。

当你没有更多的东西要读时,你需要确保优雅地退出循环,因此会中断,尽管如果你的文件是"正确的",第二次就足够了。

您还需要确保转换为向量类所期望的正确类型。我在这里假设它是int,但如果它是string,则不需要我已经设置好的转换。

#include <string>
#include <fstream>
using namespace std;
void yourFunction()
{
    ..
    ifstream myfile("myfile.txt");
    string xword, yword;
    while (1) {
        if (!getline(myfile, xword, 't'))
            break;
        if (!getline(myfile, yword))
            break;
        myVector.push_back(stoi(xword), stoi(yword));
    }
    ...
}

这种解析可以用boost.spirit:在一行中完成

qi::phrase_parse(begin, end, *(qi::int_ > qi::int_ > qi::eol), qi::ascii::blank, v);

语法可以读为:"读一个int,然后读一个整型,再读一个EOL(行尾)(\r\n或\r\n,取决于区域设置),尽可能多次"。在int和EOL之间可以找到空白字符(例如空格或制表符)。

优点:与std::getline循环相比,代码更清晰/简洁。spirit.qi可以给你更强大的控制,你不需要stoi呼叫。缺点:构建依赖于(不依赖于)精神。qi,编译时间。

#include <iostream>
#include <fstream>
#include <vector>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>
namespace spirit = boost::spirit;
namespace qi = spirit::qi;
int main(int argc, char **argv)
{
  std::ifstream in(argv[1], std::ios_base::in);
  std::string storage;
  in.unsetf(std::ios::skipws);
  spirit::istream_iterator begin(in), end;
  std::vector<std::pair<int, int> > v;
  qi::phrase_parse(begin, end, *(qi::int_ > qi::int_ > qi::eol), qi::ascii::blank, v);
  for(const auto& p : v)
    std::cout << p.first << "," << p.second << std::endl;
  return 0;
}

相关内容

  • 没有找到相关文章

最新更新