2017-09-28 6 views
1

このようなテキストファイルには、数字の間にコンマを入れた行列がありますが、各行の末尾にコンマはありません。C++のベクトルを使用してテキストファイルから行列を読み取る

 
1,2,3,4 
7,8,2,1 
3,4,5,6 
7,2,1,3 

私はこのような2D配列でこれをしようとしていましたが、マトリックスのサイズも不明であるため実際にはうまくいきませんでした。

string array[4][4]; 
int id; 
for (int i = 0; i < 4; i++) { // go through each line 
    for (int j = 0; j < 4; j++) { 
      getline(filein, numbers, ','); 
      array[i][j] = numbers; 
      cout << array[i][j] << endl; 
    } 
} 

私は2Dベクトルを使用してそのようにしたいと思いますが、その方法はわかりません。

でベクトルを作成した後
vector<vector<string>> matrix; 

ループ内にもう1つのベクターを作成する必要がありますか?

答えて

0

ダブルstd::vectorを使用し、ファイルを1行ずつ読み込み、コンマも解析すると、完了です。行を読むたびに、ベクトルのサイズを1増やします。これはstd::vector::resize()で行うことができます。

例、 "matrix.txt" としてあなたのファイルを使用して:

#include <iostream> 
#include <sstream> 
#include <string> 
#include <fstream> 
#include <vector> 

int main(void) { 
    std::vector<std::vector<int>> matrix; 
    std::ifstream infile("matrix.txt"); 
    int a, b, c, d; 
    char comma; 
    while (infile >> a >> comma >> b >> comma >> c >> comma >> d) 
    { 
     //std::cout << a << " " << b << " " << c << " " << d << std::endl; 
     matrix.resize(matrix.size() + 1); 
     matrix[matrix.size() - 1].push_back(a); 
     matrix[matrix.size() - 1].push_back(b); 
     matrix[matrix.size() - 1].push_back(c); 
     matrix[matrix.size() - 1].push_back(d); 
    } 

    for(auto row: matrix) { 
     for(auto v: row) { 
      std::cout << v << " "; 
     } 
     std::cout << "\n"; 
    } 
    return 0; 
} 

出力:ベクトルの

Georgioss-MacBook-Pro:~ gsamaras$ g++ -std=c++0x main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
1 2 3 4 
7 8 2 1 
3 4 5 6 
7 2 1 3 
+0

おかげで私たちは、txtファイルにどのように多くのカンマを知らない???:

std::vector<std::vector<int>> v; // declare vector of vectors std::ifstream ifs("myfile.txt"); // open the file std::string tempstr; // declare a temporary string int tempint; // declare a temporary integer char delimiter; // declare a temporary delimiter while (std::getline(ifs, tempstr)) { // read line by line from a file into a string std::istringstream iss(tempstr); // initialize the stringstream with that string std::vector<int> tempv; // declare a temporary vector for the row while (iss >> tempint) { // extract the numbers from a stringstream tempv.push_back(tempint); // push it onto our temporary vector iss >> delimiter; // read the , delimiter } v.push_back(tempv); // push the vector onto vector of vectors } 

完全なソースコードがあります – rektandlove

+0

ファイル内のすべての行に4つの数字と3つのカンマ@rektandlove;があることをご存知でしょうか? – gsamaras

+0

txtファイルは5x5または3x3に変更することはできません:( – rektandlove

1

使用ベクトル。ここでは、各ラインの解説は次のとおりです。

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <sstream> 
#include <string> 

int main() { 
    std::vector<std::vector<int>> v; 
    std::ifstream ifs("myfile.txt"); 
    std::string tempstr; 
    int tempint; 
    char delimiter; 

    while (std::getline(ifs, tempstr)) { 
     std::istringstream iss(tempstr); 
     std::vector<int> tempv; 
     while (iss >> tempint) { 
      tempv.push_back(tempint); 
      iss >> delimiter; 
     } 
     v.push_back(tempv); 
    } 

    for (auto row : v) { 
     for (auto el : row) { 
      std::cout << el << ' '; 
     } 
     std::cout << "\n"; 
    } 
} 
関連する問題