Lesen einer Textdatei in ein 2-D-Array in C++

Dhruvdeep Singh Saini 12 Oktober 2023
  1. Verwenden von fstream zum Lesen einer Textdatei in ein 2-D-Array in C++
  2. Lesen einer Textdatei in ein dynamisches 2-D-Array in C++
Lesen einer Textdatei in ein 2-D-Array in C++

In diesem Artikel werden die beiden Ansätze zum Einlesen einer Textdatei in ein 2D-Array in C++ erläutert.

Verwenden von fstream zum Lesen einer Textdatei in ein 2-D-Array in C++

Um unsere Eingabetextdatei in C++ in ein 2-D-Array einzulesen, verwenden wir die Funktion ifstream. Es hilft uns, die einzelnen Daten mit dem Extraktionsoperator zu lesen.

Binden Sie die Standardbibliothek #include<fstream> ein, bevor Sie ifstream verwenden.

Angenommen, unsere Textdatei enthält die folgenden Daten.

10 20 30 40
50 60 70 80
90 100 110 120
130 140 150 160

Wir müssen die Datei öffnen und den Compiler anweisen, Eingaben aus der Datei zu lesen. Wir werden den Konstruktor ifstream verwenden, um einen Dateistream zu erstellen.

#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;
  }
}

Ausgabe:

10      20      30      40
50      60      70      80
90      100     110     120
130     140     150     160

Wie wir sehen können, haben wir die Größe des 2-D-Arrays deklariert, das inputfile definiert und seine Adresse mit ifstream bereitgestellt.

Wenn sich die Textdatei im selben Ordner befindet, geben Sie nur den Namen und die Erweiterung an. Wenn sich die Textdatei jedoch in einem anderen Ordner befindet, achten Sie darauf, die vollständige Adresse der Textdatei vom Computersystem einzufügen.

Nachdem wir die Datei deklariert haben, verwenden wir for-Schleifen für jede Zeile und Spalte, um die Eingabe aus der Textdatei zu erhalten. Und sobald wir die Eingabe erhalten haben, gibt die verschachtelte for-Schleife jedes Element aus dem Array aus.

Die obige Methode ist nur für statische und quadratische 2D-Arrays in C++ geeignet, bei denen die Größe des Arrays bekannt ist. Andernfalls setzt der Compiler die Eingabe aus der Textdatei auf die falschen Positionen innerhalb des 2-D-Arrays.

Wenn Sie in C++ ein 2-D-Array definieren möchten, das kein Quadrat ist, müssen wir ein Array mit der Anzahl der Spalten innerhalb der ersten for-Schleife erstellen.

Betrachten Sie das folgende Beispiel zur Definition eines nichtquadratischen 2D-Arrays.

// 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];
  }
}

Lesen einer Textdatei in ein dynamisches 2-D-Array in C++

Wir verwenden keine Arrays, wenn wir eine Texteingabe für eine dynamische C++-Matrixstruktur wünschen. Stattdessen verwenden wir Vektoren.

Ein Vektor ermöglicht die Erstellung von dynamisch zugewiesenen Arrays über die Schnittstelle von Listen. Vektoren können zunehmen, wenn sie Speicher in Heaps verwenden und automatisch freigegeben werden.

Angenommen, unsere Textdatei enthält die folgenden Zeichen.

R O W 1
A B
R O W 3
X Y
R O W 5

Um einen 2-D-Vektor in C++ zu erstellen, implementieren wir den folgenden Code.

#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;
}

Ausgabe:

R O W 1
A B
R O W 3
X Y
R O W 5

Im obigen Programm haben wir erfolgreich einen 2D-Vektor erstellt. Dann haben wir die Datei für die Texteingabe mit der Bibliothek ifstream geöffnet.

Die while-Schleife extrahierte die Zeichen aus der Textdatei mit der Standardmethode getline. Die Variable x wird dann verwendet, um jede Zeile aus der Textdatei zu durchlaufen und ein Element zurück in den Vektor eachrow zu schieben, nachdem ein Leerzeichen in der Textdatei gefunden wurde.

Danach benutzte die Schleife erneut die Funktion push_back, um die ganze Zeile in den 2-D-Vektor zu verschieben. Dies wird für alle Eingaben in allen in der Textdatei vorhandenen Zeilen wiederholt.

Die zweite for-Schleife wird verwendet, um MyVector zu drucken.