我正在尝试创建多个包含输入文件内容的最大大小为10的数组。假设文件的格式如下:
1 3 2 4 0 5 8 -3
3 1 4 6 0 3
4 83 2 12 1 3
4 30 4 -2
每行不能超过10个整数。
void read_input(ifstream &file)
{
vector<array<int, 10> > main_array;
while(!(file.eof()))
{
int idx = 0;
string values;
array<int, 10> part_array;
getline(file, values);
istringstream inStream;
inStream.str(values);
while((inStream >> part_array[idx++]).good() == true);
main_array.push_back(part_array);
file.ignore();
}
for(auto it = main_array.begin(); it != main_array.end(); it++)
{
for(auto& s: *it)
{
cout << s << " ";
}
cout << "\n";
}
}
这给了我输出:
1 3 2 4 0 5 8 -3 0 6164240
1 4 6 0 3 5 8 -3 0 6164240
83 2 12 1 3 5 8 -3 0 6164240
30 4 -2 1 3 5 8 -3 0 6164240
这显然是错误的。我知道这可能与我迭代未初始化的数组元素,但我怎么能避免这个错误?就像一个注释,本质上我使用数组来保存文件中每行的值。也就是说,一个数组必须处理第一行中的整数;另一个在第二行...
答案 0 :(得分:2)
您可以使用
vector<vector<int> > main_array;
而不是数组 - 然后只需从输入中读取项目并将它们(push_back)推送到“内部”向量中 - 这样,如果数据行短于10个元素,则最后不会有未初始化的数组元素
完整的解决方案可能如下所示(为了保持一致性,我保留了原始代码的某些部分):
using namespace std;
void read_input(ifstream &file)
{
vector<vector<int> > main_array;
string line; //buffer for single line read from file
// reading part
while(getline(file, line))
{
stringstream inStream(line);
vector<int> row; //single row buffer
int val = 0;
while(inStream >> val)
{
row.push_back(val);
}
main_array.push_back(row);
}
//display part
for(auto it = main_array.begin(), end = main_array.end(); it != end; ++it)
{
for(auto& s: *it)
{
cout << s << " ";
}
cout << "\n";
}
}
答案 1 :(得分:2)
如果您觉得有用,请使用此
void readData(ifstream &inf)
{
string str;
vector<vector<int>> intArr;
while (getline(inf, str))
{
stringstream ss(str);
int i;
vector<int> a;
while (ss >> i)
{
a.push_back(i);
}
intArr.push_back(a);
}
}
您不应使用eof()
来检查文件结尾。
答案 2 :(得分:1)
std :: array是一个封装常量大小数组的容器。因此,通过使用array<int, 10>
声明,数组中已经有10个整数。您需要使用向量,然后更改循环
while((inStream >> part_array[idx++]).good() == true);
到
bool good = true;
while(idx <10 ) {
int v;
if(!(inStream >> v).good() ) break;
idx++;
part_array.push_back(v); //now a vector
}
答案 3 :(得分:0)
您使用了包含10个元素的array
但您知道可能少于10个项目。最好使用矢量,push_back
你拥有的东西。
除此之外,代码存在各种潜在问题。如果你发送一个错误的ifstream
,它会陷入循环。
while(!(file.eof()))
正在寻找麻烦。
接下来,file.ignore();
然后忽略每行的第一项。如果您按照人们的说法更改为使用向量向量,请使用while(getline(file, values))
而不是使用eof
检查并删除它应该有效的ignore
。
答案 4 :(得分:-1)
更改此行
array<int, 10> part_array;
到
array<int, 10> part_array = {};