C++ でテキストファイルを 2 次元配列に読み込む
この記事では、C++ でテキストファイルを 2 次元配列に読み込む 2つの方法について説明します。
C++ で fstream
を使用してテキストファイルを 2 次元配列に読み込む
入力テキストファイルを C++ の 2 次元配列に読み込むには、ifstream
関数を使用します。抽出演算子を使用して個々のデータを読み取るのに役立ちます。
ifstream
を使用する前に、#include<fstream>
標準ライブラリをインクルードしてください。
テキストファイルに次のデータがあるとします。
10 20 30 40
50 60 70 80
90 100 110 120
130 140 150 160
ファイルを開いて、ファイルから入力を読み取るようにコンパイラーに指示する必要があります。ifstream
コンストラクターを使用してファイルストリームを作成します。
#include <fstream>
#include <iostream>
using namespace std;
int main() {
int row = 4;
int col = 4;
int myArray[row][col];
// Opening the file
ifstream inputfile("2dinput.txt");
if (!inputfile.is_open()) cout << "Error opening file";
// Defining the loop for getting input from the file
for (int r = 0; r < row; r++) // Outer loop for rows
{
for (int c = 0; c < col; c++) // inner loop for columns
{
inputfile >> myArray[r][c]; // Take input from file and put into myArray
}
}
for (int r = 0; r < row; r++) {
for (int c = 0; c < col; c++) {
cout << myArray[r][c] << "\t";
}
cout << endl;
}
}
出力:
10 20 30 40
50 60 70 80
90 100 110 120
130 140 150 160
ご覧のとおり、2 次元配列のサイズを宣言し、inputfile
を定義し、ifstream
を使用してそのアドレスを提供しました。
テキストファイルが同じフォルダにある場合は、名前と拡張子のみを指定してください。ただし、テキストファイルが別のフォルダにある場合は、必ずコンピュータシステムからテキストファイルの完全なアドレスを貼り付けてください。
ファイルを宣言した後、各行と列に for
ループを使用して、テキストファイルから入力を取得します。そして、入力を取得すると、ネストされた for
ループが配列からすべての要素を出力します。
上記の方法は、配列のサイズがわかっている C++ の静的および正方形の 2 次元配列にのみ適しています。そうしないと、コンパイラはテキストファイルからの入力を 2 次元配列内の間違った位置に設定します。
正方形ではない C++ で 2 次元配列を定義する場合は、最初の for
ループ内に列数の配列を作成する必要があります。
以下の非正方形 2 次元配列を定義する方法の例を考えてみましょう。
// Declare number of rows
2Darray = new int*[8];
ifstream myfile("File Address");
for (int r = 0; r < 8; r++) // Outer loop for 8 rows
{
2Darray [c] = new int[5]; // Each row has 5 columns
for (int c = 0; c < 5; c++) // Inner loop for columns
{
file >> 2Darray [r][c];
}
}
テキストファイルを C++ の動的 2 次元配列に読み込む
動的 C++ マトリックス構造のテキスト入力が必要な場合は、配列を使用しません。代わりに、ベクトルを使用します。
ベクトルを使用すると、リストのインターフェイスを介して動的に割り当てられた配列を作成できます。ベクトルは、ヒープ内のメモリを使用し、自動的に割り当てが解除されるため、増加する可能性があります。
テキストファイルに次の文字が含まれているとします。
R O W 1
A B
R O W 3
X Y
R O W 5
C++ で 2 次元ベクトルを作成するには、以下のコードを実装します。
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
int main() {
std::string eachrow;
std::ifstream myfile("2dinputvector.txt");
std::vector<std::vector<char> > MyVector;
while (std::getline(myfile, eachrow)) {
std::vector<char> row;
for (char &x : eachrow) {
if (x != ' ')
// add element to vector row
row.push_back(x);
}
// after iterating row in text file, add vector into 2D vector
MyVector.push_back(row);
}
for (std::vector<char> &row : MyVector) {
for (char &x : row)
// print each element
std::cout << x << ' ';
// change row
std::cout << '\n';
}
return 0;
}
出力:
R O W 1
A B
R O W 3
X Y
R O W 5
上記のプログラムでは、2 次元ベクトルの作成に成功しました。次に、ifstream
ライブラリを使用してテキスト入力用のファイルを開きました。
while
ループは、標準の getline
メソッドを使用してテキストファイルから文字を抽出しました。次に、変数 x
を使用して、テキストファイルから各行を繰り返し、テキストファイルでスペースが検出された後、要素をベクトル eachrow
にプッシュバックします。
この後、ループは再び push_back
関数を使用して、行全体を 2 次元ベクトルに移動しました。これは、テキストファイルに存在するすべての行のすべての入力に対して繰り返されます。
2 番目の for
ループは、MyVector
を表示するために使用されます。