Cómo leer un archivo línea por línea en C++

Jinku Hu 12 octubre 2023
  1. Usa la función std::getline() para leer un archivo línea por línea
  2. Utilice la biblioteca C getline() Función para leer un archivo línea por línea
Cómo leer un archivo línea por línea en C++

Este artículo presentará cómo leer un archivo línea por línea en C++.

Usa la función std::getline() para leer un archivo línea por línea

La función getline() es la forma preferida de leer un archivo línea por línea en C++. La función lee los caracteres del flujo de entrada hasta que se encuentra el carácter delimitador y luego los almacena en una cadena. El delimitador se pasa como el tercer parámetro opcional, y por defecto, se asume que es un nuevo carácter de línea \n.

Dado que el método getline devuelve un valor distinto de cero si los datos pueden ser leídos desde la corriente, podemos ponerlo como una condición de bucle while para continuar recuperando líneas de un archivo hasta que se llegue al final del mismo. Observe que es una buena práctica verificar si la secuencia de entrada tiene un archivo asociado con el método is_open.

#include <fstream>
#include <iostream>
#include <vector>

using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::string;
using std::vector;

int main() {
  string filename("input.txt");
  vector<string> lines;
  string line;

  ifstream input_file(filename);
  if (!input_file.is_open()) {
    cerr << "Could not open the file - '" << filename << "'" << endl;
    return EXIT_FAILURE;
  }

  while (getline(input_file, line)) {
    lines.push_back(line);
  }

  for (const auto &i : lines) cout << i << endl;

  input_file.close();
  return EXIT_SUCCESS;
}

Utilice la biblioteca C getline() Función para leer un archivo línea por línea

La función getline puede ser usada de manera similar para hacer un bucle a través del archivo línea por línea y almacenar las líneas extraídas en una variable de cadena de caracteres. La principal diferencia es que debemos abrir un flujo de archivos usando la función fopen, que devuelve el objeto FILE*, que luego se pasa como tercer parámetro.

Fíjate que la función getline almacena en el puntero char, que se establece en nullptr. Esto es válido porque la propia función asigna la memoria de forma dinámica para los caracteres recuperados. Por lo tanto, el puntero char debe ser liberado explícitamente por un programador, incluso si la llamada getline ha fallado.

Además, es importante poner el segundo parámetro del tipo size_t a 0 antes de llamar a la función. Puedes ver el manual detallado de la función getline aquí.

#include <iostream>
#include <vector>

using std::cerr;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  string filename("input.txt");
  vector<string> lines;
  char* c_line = nullptr;
  size_t len = 0;

  FILE* input_file = fopen(filename.c_str(), "r");
  if (input_file == nullptr) return EXIT_FAILURE;

  while ((getline(&c_line, &len, input_file)) != -1) {
    lines.push_back(line.assign(c_line));
  }
  for (const auto& i : lines) {
    cout << i;
  }
  cout << endl;
  fclose(input_file);
  free(c_line);

  return EXIT_SUCCESS;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ File