【问题标题】:Reading variable size 2D-STL vector from file从文件中读取可变大小的 2D-STL 矢量
【发布时间】:2013-06-13 13:09:45
【问题描述】:
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

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

【问题讨论】:

  • “我失败了”不够详细。请准确说明会发生什么以及您的预期。
  • 你不妨看看getlinestringstream

标签: c++


【解决方案1】:

确保数据文件中每一行的最后一个整数之后没有空格。 在当前的代码中,您没有将最后一个整数添加到虚拟向量中。修改如下:

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();
       }
}

【讨论】:

  • @UtkristAdhikari:除了说声谢谢,支持这个答案会更好 :)
【解决方案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】:

考虑使用 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;
}

【讨论】:

  • 将数字作为适当的数据类型存储在向量中。我问这个是因为我们正在将该行读入字符串。
【解决方案4】:

除了\n 之外,行尾的数字后面可能还有其他空白字符。喜欢空格:

1234  445  445    \n
              ^^^^

所以你的方法不安全。最好将整行 (getline) 读取到某个字符串,然后在包含此 string 的行上构造 istringstream,然后只需将此 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);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2018-09-07
    • 2013-08-25
    相关资源
    最近更新 更多