2
1 3
2 4 8 13
3 5 6 13
4
4
8
3 7 9 10 13
8 10 11
8 9 11 12
9 10
10 15
3 4 8 14
13
12 16
15 17 18
16
18 16
我想将这些值从文件读入二维STL向量。请注意,内部矢量的大小并不统一,并且未知,所以我需要检测'\ n'。到目前为止,我一直不成功。我的代码如下。请帮忙。有什么问题?
int main()
{
ifstream Lin("A.txt");
double d;
vector<vector<double> > A;
vector<double> dummy;
if (Lin.is_open()){
while (Lin >> d) {
if (Lin.peek() == '\n'){
A.push_back(dummy);
dummy.clear();
}else{
dummy.push_back(d);
}
}
Lin.close();
}
...
return 0;
}
当我使用以下代码迭代向量时 ,它揭示了存储的内容:
for(int i = 0; i< A.size(); i++){
for(int j = 0; j< A[i].size() ; j++){
cout << A[i][j] << " ";
}
cout << endl;
}
1
2 4 8
3 5 6
3 7 9 10
8 10
8 9 11
9
10
3 4 8
12
15 17
18
预期输出与存储在文件中的方式相同
答案 0 :(得分:4)
确保数据文件中每行的最后一个整数后面没有空格。 在代码中,您当前没有将最后一个整数添加到虚拟向量。像这样修改它:
while (Lin >> d)
{
dummy.push_back(d); // Add the number first
if (Lin.peek() == '\n') // Then check if it is end of line
{
A.push_back(dummy);
dummy.clear();
}
}
答案 1 :(得分:2)
考虑使用getline。
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main() {
std::string line;
std::vector<std::vector<double> > v;
while(std::getline(cin, line)) {
std::stringstream ss(line);
double value;
std::vector<double> numbers;
while(ss >> value) {
numbers.push_back(value);
std::cout << value << std::endl;
}
v.push_back(numbers);
}
return 0;
}
答案 2 :(得分:2)
少即是多。这取代了整个循环。注意:您不需要检查is_open
或致电close
才能安全地工作。
for(std::string s; std::getline(Lin, s);)
{
A.emplace_back(std::istream_iterator<double>(std::istringstream(s)),
std::istream_iterator<double>());
}
答案 3 :(得分:0)
除了\n
之外,在行尾的数字后面可能还有其他空白字符。像空格一样:
1234 445 445 \n
^^^^
所以你的方法并不安全。更好的方法是将整行(getline
)读取到某个字符串,然后在此istringstream
包含行上构建string
,然后将此istringstream
解析为vector
一行。
像这样:
for (string line; getline(filein, line); ) {
vector<double> dd;
istringstream is(line);
for (double d; is >> d; )
dd.push_back(d);
if (not dd.empty())
A.push_back(dd);
}