用C ++ ifstream从文本文件中读取整数
我想从文本文件中读取graphics邻接信息并将其存储到一个向量中。
-
该文件具有任意数量的行
-
每行有任意数量的以'\ n'结尾的整数
例如,
First line: 0 1 4 Second line: 1 0 4 3 2 Thrid line: 2 1 3 Fourth line: 3 1 2 4 Fifth line: 4 0 1 3
如果我使用getline()一次读取一行,我该如何parsing这一行(因为每一行都有可变整数)?
有什么build议么?
标准阅读习语成语:
#include <fstream> #include <sstream> #include <string> #include <vector> std::ifstream infile("thefile.txt"); std::string line; while (std::getline(infile, line)) { std::istringstream iss(line); int n; std::vector<int> v; while (iss >> n) { v.push_back(n); } // do something useful with v }
这是一个使用for
循环的单行版本。 我们需要一个辅助工具(信贷给@ Luc Danton !),它与std::move
相反:
namespace std { template <typename T> T & stay(T && t) { return t; } } int main() { std::vector<std::vector<int>> vv; for (std::string line; std::getline(std::cin, line); vv.push_back(std::vector<int>(std::istream_iterator<int>(std::stay(std::istringstream(line))), std::istream_iterator<int>()) ) ) { } std::cout << vv << std::endl; }
首先使用std::getline
函数读取一行,然后使用std::stringstream
从行读取整数:
std::ifstream file("input.txt"); std::vector<std::vector<int>> vv; std::string line; while(std::getline(file, line)) { std::stringstream ss(line); int i; std::vector<int> v; while( ss >> i ) v.push_back(i); vv.push_back(v); }
你也可以这样编写循环体:
while(std::getline(file, line)) { std::stringstream ss(line); std::istream_iterator<int> begin(ss), end; std::vector<int> v(begin, end); vv.push_back(v); }
这看起来更短,更好。 或合并 – 最后两行:
while(std::getline(file, line)) { std::stringstream ss(line); std::istream_iterator<int> begin(ss), end; vv.push_back(std::vector<int>(begin, end)); }
现在不要缩短,因为它看起来很丑。