【问题标题】:Formatted reading a file data C++格式化读取文件数据 C++
【发布时间】:2011-12-20 08:10:38
【问题描述】:

我的文件中有以下格式的数据 ( p1, p2 ) (p3, p4 ) ( p5, p6 )

我如何在 C++ 中读取这个,我可以读取一行并解析它,但我正在寻找一些 C++ stl 的方式来读取这种格式。

【问题讨论】:

标签: c++ stl


【解决方案1】:

这取决于您希望在程序中表示数据的格式。一种方法是使用带有自定义流提取运算符的struct

struct Data {
    int val1; // just assuming int for the data-type
    int val2;
};

std::istream & operator>>(std::istream& input, Data & obj) {
    input.ignore(2, '('); // skip all including opening brace
    input >> obj.val1;
    input.ignore(2, ','); // skip comma
    input >> obj.val2;
    input.ignore(2, ')'); // skip closing brace
    return input;
}

正如@Seth Carnegie 在answer to a similar question 中演示的那样,您也可以使用INT_MAX 来确保您跳过足够多的内容 - 但是,使用std::numeric_limits<std::streamsize>::max() 会更好。

然后你可以像这样读取文件的所有内容:

std::vector<Data> all_data;
std::ifstream input_file("your_file.txt");
std::copy(std::istream_iterator<Data>(input_file), 
          std::istream_iterator<Data>(),
          std::back_inserter(all_data));

Here 是一个完整的工作示例。

【讨论】:

  • 使用面向流的操作是一个很好的建议恕我直言。但是建议的实现不会也接受 incorrect 输入,例如:[ 42 : 42 } 吗?
  • 你的意思是INT_MAX而不是MAX_INT吗?
  • @ereOn:是的,它会的。它假设输入格式正确。在那里添加错误检查会使它变得更加复杂。
  • 这在 Windows 上不起作用。我在 Windows 上尝试了您的示例,但不起作用。虽然在 Unix 上工作。
  • 在 linux 上你的例子可以工作并给我输出,但在 windows 上我什么都没有。
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2017-08-06
  • 2015-10-31
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多