从文件中读取可变大小的2D-STL向量

时间:2013-06-13 13:09:45

标签: c++

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 个答案:

答案 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);
    }