C++에서 텍스트 파일을 2차원 배열로 읽기

Dhruvdeep Singh Saini 2023년10월12일
  1. fstream을 사용하여 C++의 2차원 배열로 텍스트 파일 읽기
  2. C++에서 동적 2차원 배열로 텍스트 파일 읽기
C++에서 텍스트 파일을 2차원 배열로 읽기

이 기사에서는 C++에서 텍스트 파일을 2차원 배열로 읽는 두 가지 접근 방식에 대해 설명합니다.

fstream을 사용하여 C++의 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차원 벡터로 이동했습니다. 이것은 텍스트 파일에 있는 모든 행의 모든 ​​입력에 대해 반복됩니다.

두 번째 for 루프는 MyVector를 인쇄하는 데 사용됩니다.