我文件的每一行都包含一个未知数量的整数,这些整数用空格分隔。我想在每一行中读取这些整数的向量。
以下是此类文件的示例:
11 3 0 1
4 5 0 3
2 3 4 1
23 4 25 15 11
0 2 6 7 10
5 6 2
1
11
我已经能够使用以下方法成功读取少量数据(请注意,outer_layers是包含我试图填充的这些向量的向量):
for (int i = 0; i < outer_layers.size(); i++)
{
while (in >> temp_num)
{
outer_layers[i].inner_layer.push_back(temp_num);
if (in.peek() == '\n')
break;
}
}
但是,当我尝试读取大量数据时,有时它会在一个向量下读取两行。在其中一个文件中,在24行中,它有两次读取两行,所以最后两个向量没有任何数据。
我无法绕过它。我有什么想法吗?
编辑:我在麻烦制造者文件的某些行中发现了一些有趣的事情:
假设有三行。
23 42 1 5
1 0 5 10
2 3 11
第1行读入就好23 42 1 5
;但是,第2行和第3行一起读作1 0 5 10 2 3 11
。
在Notepad ++中,它们看起来很好,每个都在各自的行上。但是,在记事本中,它们看起来像这样:
23 42 1 51 0 5 10 2 3 11
如果您注意到,5
(第1行的最后一个整数)和1
(第2行的第一个整数)不用空格分隔;但是,10
和2
由空格分隔。
我注意到任何双读入行的行为。如果它们被一个空格隔开,那么它们都被读入。不知道为什么会发生这种情况,考虑到Notepad ++中仍然应该有一个新的行字符来显示单独的行,我是对的吗?
答案 0 :(得分:5)
我不确定您的outer_layers
和inner_layers
是如何设置的,但您可以使用std::getline
和std::stringstream
来填充这样的向量:
std::vector< std::vector<int> > V ;
std::vector <int> vec;
std::ifstream fin("input.txt");
std::string line;
int i;
while (std::getline( fin, line) ) //Read a line
{
std::stringstream ss(line);
while(ss >> i) //Extract integers from line
vec.push_back(i);
V.push_back(vec);
vec.clear();
}
fin.close();
for(const auto &x:V)
{
for(const auto &y:x)
std::cout<<y<<" ";
std::cout<<std::endl;
}