Leer archivo de texto en un array 2D en C++

Dhruvdeep Singh Saini 12 octubre 2023
  1. Use fstream para leer un archivo de texto en un array 2-D en C++
  2. Lea el archivo de texto en un array dinámica 2-D en C++
Leer archivo de texto en un array 2D en C++

Este artículo discutirá los dos enfoques para leer un archivo de texto en un array 2-D en C++.

Use fstream para leer un archivo de texto en un array 2-D en C++

Para leer nuestro archivo de texto de entrada en un array 2-D en C++, usaremos la función ifstream. Nos ayudará a leer los datos individuales usando el operador de extracción.

Incluya la biblioteca estándar #include<fstream> antes de usar ifstream.

Supongamos que nuestro archivo de texto tiene los siguientes datos.

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

Tenemos que abrir el archivo y decirle al compilador que lea la entrada del archivo. Usaremos el constructor ifstream para crear un flujo de archivos.

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

Producción :

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

Como podemos ver, declaramos el tamaño del array 2-D, definimos el inputfile y proporcionamos su dirección usando ifstream.

Si el archivo de texto está en la misma carpeta, solo proporcione el nombre y la extensión. Sin embargo, si el archivo de texto está en otra carpeta, asegúrese de pegar la dirección completa del archivo de texto del sistema informático.

Después de declarar el archivo, usamos bucles for para cada fila y columna para obtener la entrada del archivo de texto. Y una vez que hemos obtenido la entrada, el bucle for anidado imprime todos los elementos del array.

El método anterior solo es adecuado para arrays bidimensionales estáticas y cuadradas en C++, donde se conoce el tamaño del array. De lo contrario, el compilador establecerá la entrada del archivo de texto en las posiciones incorrectas dentro del array 2-D.

Si desea definir un array 2-D en C++ que no sea un cuadrado, debemos crear un array del número de columnas dentro del primer bucle for.

Considere el ejemplo de cómo definir un array 2-D no cuadrada a continuación.

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

Lea el archivo de texto en un array dinámica 2-D en C++

No usamos arreglos si queremos una entrada de texto para una estructura matricial dinámica de C++. En su lugar, usamos vectores.

Un vector permite la creación de arrays asignadas dinámicamente a través de la interfaz de listas. Los vectores pueden aumentar a medida que usan la memoria en montones y se desasignan automáticamente.

Supongamos que nuestro archivo de texto tiene los siguientes caracteres.

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

Para crear un vector 2-D en C++, implementamos el siguiente código.

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

Producción :

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

En el programa anterior, creamos con éxito un vector 2-D. Luego abrimos el archivo para la entrada de texto usando la biblioteca ifstream.

El bucle while extrajo los caracteres del archivo de texto usando el método estándar getline. Luego, la variable x se usa para iterar cada fila del archivo de texto y empujar un elemento de regreso al vector eachrow después de encontrar un espacio en el archivo de texto.

Después de esto, el bucle usó la función push_back nuevamente para mover toda la fila al vector 2-D. Esto se repite para todas las entradas en todas las filas presentes en el archivo de texto.

El segundo bucle for se usa para imprimir MyVector.