Lire un fichier mot à mot en C++
-
Utiliser
std::ifstream
pour lire un fichier mot à mot en C++ -
Utilisez les fonctions
std::ispunct
etstd::string::erase
pour analyser les symboles de ponctuation en C++
Cet article présente plusieurs méthodes expliquant comment lire un fichier mot par mot en C++.
Utiliser std::ifstream
pour lire un fichier mot à mot en C++
La classe std::ifstream
peut être utilisée pour effectuer des opérations d’entrée sur des flux basés sur des fichiers. A savoir, le type std::ifstream
est utilisé pour s’interfacer avec le tampon de fichier et y opérer en utilisant l’opérateur d’extraction. Notez que le type std::fstream
est également fourni dans la bibliothèque d’E/S compatible avec les opérateurs d’extraction (>>
) et d’insertion (<<
).
Dans un premier temps, nous devons créer un objet de type ifstream
en appelant l’un de ses constructeurs; dans ce cas, seule la chaîne de nom de fichier est transmise à la fonction constructeur. Une fois l’objet ifstream
créé, une de ses méthodes - is_open
doit être appelée pour vérifier que l’appel a réussi puis procéder à la lecture du contenu du fichier.
Pour lire le fichier mot par mot, nous appelons l’opérateur d’extraction sur l’objet ifstream
. Nous le redirigeons vers la variable string, qui lit automatiquement le premier mot avant que le premier caractère d’espace ne soit rencontré. Puisque nous avons besoin de lire chaque mot jusqu’à la fin du fichier, nous insérons l’instruction d’extraction dans une expression de boucle while
. De plus, nous avons déclaré un vector
de chaînes pour stocker chaque mot à chaque itération et imprimer plus tard avec un bloc de boucle séparé.
#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;
}
Utilisez les fonctions std::ispunct
et std::string::erase
pour analyser les symboles de ponctuation en C++
Le seul inconvénient de la méthode précédente est qu’elle stocke les caractères de ponctuation à proximité des mots dans le vector
de destination. Il vaudrait mieux analyser chaque mot puis les stocker dans un conteneur vector
. Nous utilisons la fonction ispunct
qui prend un seul caractère comme paramètre int
et renvoie une valeur entière non nulle si le caractère est une ponctuation; sinon - zéro est renvoyé.
Notez que le comportement de la fonction ispunct
n’est pas défini si l’argument donné n’est pas représentable comme unsigned char
; il est donc recommandé de convertir le caractère dans le type correspondant. Dans l’exemple suivant, nous avons implémenté les deux conditions simples if
pour vérifier le premier et le dernier caractère de chaque mot. Si la ponctuation est trouvée, nous appelons une fonction de chaîne intégrée - erase
pour supprimer les caractères trouvés.
#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