Leggere file parola per parola in C++
-
Usare
std::ifstream
per leggere un file parola per parola in C++ -
Usa le funzioni
std::ispunct
estd::string::erase
per analizzare i simboli di punteggiatura in C++
Questo articolo illustrerà più metodi su come leggere un file parola per parola in C++.
Usare std::ifstream
per leggere un file parola per parola in C++
La classe std::ifstream
può essere utilizzata per condurre operazioni di input su flussi basati su file. Vale a dire, il tipo std::ifstream
viene utilizzato per interfacciarsi con il buffer di file e operare su di esso utilizzando l’operatore di estrazione. Notare che il tipo std::fstream
è fornito anche nella libreria I/O che è compatibile sia con gli operatori di estrazione (>>
) e di inserimento (<<
).
In un primo momento, dobbiamo creare un oggetto di tipo ifstream
chiamando uno dei suoi costruttori; in questo caso, solo la stringa del nome del file viene passata alla funzione di costruzione. Una volta creato l’oggetto ifstream
, dovrebbe essere chiamato uno dei suoi metodi - is_open
per verificare che la chiamata sia andata a buon fine e poi procedere alla lettura del contenuto del file.
Per leggere il file parola per parola, chiamiamo l’operatore di estrazione sull’oggetto ifstream
. Lo reindirizziamo alla variabile stringa, che legge automaticamente la prima parola prima che venga incontrato il primo carattere spazio. Poiché abbiamo bisogno di leggere ogni parola fino alla fine del file, inseriamo l’istruzione di estrazione in un’espressione del cicli while
. Inoltre, abbiamo dichiarato un vettore
di stringhe per memorizzare ogni parola in ogni iterazione e stamparla successivamente con un blocco di bucle separato.
#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> words;
string word;
ifstream input_file(filename);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << filename << "'" << endl;
return EXIT_FAILURE;
}
while (input_file >> word) {
words.push_back(word);
}
for (const auto &i : words) {
cout << i << endl;
}
input_file.close();
return EXIT_SUCCESS;
}
Usa le funzioni std::ispunct
e std::string::erase
per analizzare i simboli di punteggiatura in C++
L’unico svantaggio del metodo precedente è che memorizza i caratteri di punteggiatura vicino alle parole nel vettore
di destinazione. Sarebbe meglio analizzare ogni parola e poi memorizzarla in un contenitore vettore
. Stiamo usando la funzione ispunct
che prende un singolo carattere come parametro int
e restituisce un valore intero diverso da zero se il carattere è la punteggiatura; in caso contrario, viene restituito zero.
Notare che il comportamento della funzione ispunct
è indefinito se l’argomento dato non è rappresentabile come unsigned char
; quindi, si consiglia di lanciare il personaggio al tipo corrispondente. Nell’esempio seguente, abbiamo implementato le due semplici condizioni if
per controllare il primo e l’ultimo carattere di ogni parola. Se viene trovata la punteggiatura, chiamiamo una funzione stringa incorporata - erase
per rimuovere i caratteri trovati.
#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> words;
string word;
ifstream input_file(filename);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << filename << "'" << endl;
return EXIT_FAILURE;
}
while (input_file >> word) {
if (ispunct(static_cast<unsigned char>(word.back())))
word.erase(word.end() - 1);
else if (ispunct(static_cast<unsigned char>(word.front())))
word.erase(word.begin());
words.push_back(word);
}
for (const auto &i : words) {
cout << i << endl;
}
input_file.close();
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