Leggere un file linea per linea in C++
-
Usa la funzione
std::getline()
per leggere un file linea per linea -
Usa la funzione
getline()
della libreria C per leggere un file linea per linea
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;
}
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