Leggere un file linea per linea in C++

Jinku Hu 12 ottobre 2023
  1. Usa la funzione std::getline() per leggere un file linea per linea
  2. Usa la funzione getline() della libreria C per leggere un file linea per linea
Leggere un file linea per linea in C++

Questo articolo introduce come leggere un file linea per linea in C++.

Usa la funzione std::getline() per leggere un file linea per linea

La funzione getline() è il modo preferito di leggere un file linea per linea in C++. La funzione legge i caratteri dal flusso di input fino a quando non viene rilevato il carattere delimitatore, quindi li memorizza in una stringa. Il delimitatore viene passato come terzo parametro opzionale e, per impostazione predefinita, si presume che sia un nuovo carattere di linea \n.

Poiché il metodo getline restituisce un valore diverso da zero se i dati possono essere letti dallo stream, possiamo metterlo come una condizione di cicli while per continuare a recuperare le linee da un file fino alla fine di esso. Nota che è buona pratica verificare se il flusso di input ha un file associato con il metodo 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;
}

Usa la funzione getline() della libreria C per leggere un file linea per linea

La funzione getline può essere usata in modo simile per scorrere il file linea per linea e memorizzare le linee estratte in una variabile stringa di caratteri. La differenza principale è che dovremmo aprire un flusso di file usando la funzione fopen, che restituisce l’oggetto FILE*, da passare poi come terzo parametro.

Notare che la funzione getline memorizza nel puntatore char, che è impostato su nullptr. Ciò è valido perché la funzione stessa alloca la memoria dinamicamente per i caratteri recuperati. Quindi, il puntatore char dovrebbe essere esplicitamente liberato da un programmatore, anche se la chiamata getline fallisce.

Inoltre, è importante impostare il secondo parametro di tipo size_t a 0 prima di chiamare la funzione. Puoi vedere il manuale dettagliato della funzione getline qui.

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

Articolo correlato - C++ File