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 

これらの値をファイルから 2 次元 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

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 に答える
2

少ないほうがいいですね。これにより、ループ全体が置き換えられます。注:これが安全に機能するために確認したり呼び出したりする必要はありません。is_openclose

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 に答える