我有一个我从中读取的文件,它包含一堆行,每行都有不同数量的整数,我无法将其拆分为整数向量的向量。
这是我目前的代码。
std::vector<int> read_line()
{
std::vector<int> ints;
int extract_int;
while((const char*)std::cin.peek() != "\n" && std::cin.peek() != -1)
{
std::cin >> extract_int;
ints.push_back(extract_int);
}
return ints;
}
std::vector<std::vector<int> > read_lines()
{
freopen("D:\\test.txt", "r", stdin);
freopen("D:\\test2.txt", "w", stdout);
std::vector<std::vector<int> > lines;
while(!std::cin.eof())
{
lines.push_back(read_line());
}
return lines;
}
问题是所有的整数都被读作一行。
我做错了什么?
答案 0 :(得分:7)
您可能希望使用getline()
读取一行,然后使用该行中的string stream,而不是尝试将整个文件视为单个流。
答案 1 :(得分:2)
问题在于你的(const char *)std::cin.peek() != "\n"
演员。 casts are evil;尽量避免使用它们。以下代码有效:
std::vector<int> read_line()
{
std::vector<int> ints;
int extract_int;
while(std::cin.peek() != '\n' && std::cin.peek() != -1)
{
std::cin >> extract_int;
ints.push_back(extract_int);
}
std::cin.ignore(); // You need this to discard the \n
return ints;
}
答案 2 :(得分:0)
使用
将单行读入矢量std::vector<int> read_line()
{
std::vector<int> ints;
std::string line;
std::getline(std::cin, line);
int i;
std::stringstream ss(line);
while (ss >> i)
ints.push_back(i);
return ints;
}
然后所有载体
std::vector< std::vector<int> > read_lines()
{
std::vector< std::vector<int> > lines;
while (std::cin) {
std::vector<int> line = read_line();
if (std::cin)
lines.push_back(line);
}
return lines;
}
然后用
打印结果template<class T>
struct print : public std::unary_function<T,void>
{
print(std::ostream &out) : os(out) {}
void operator() (T x) { os << '[' << x << ']'; }
std::ostream &os;
};
void print_vector(const std::vector<int> &v)
{
std::for_each(v.begin(), v.end(), print<int>(std::cout));
std::cout << '\n';
}
int main()
{
std::vector< std::vector<int> > lines = read_lines();
std::for_each(lines.begin(), lines.end(), print_vector);
return 0;
}
例如:
$ cat input 1 2 3 4 5 6 7 8 9 10 $ ./try.exe <input [1][2][3][4] [5][6] [7][8][9] [10]