1
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

预期的输出与文件中存储的方式相同

4

4 回答 4

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();
       }
}
于 2013-06-13T13:19:00.950 回答
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>());
}
于 2013-06-13T13:38:09.747 回答
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;
}
于 2013-06-13T13:24:13.950 回答
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);
    }
于 2013-06-13T13:19:16.887 回答