Lire un fichier mot à mot en C++

Jinku Hu 12 octobre 2023
  1. Utiliser std::ifstream pour lire un fichier mot à mot en C++
  2. Utilisez les fonctions std::ispunct et std::string::erase pour analyser les symboles de ponctuation en C++
Lire un fichier mot à mot 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;
}
Auteur: 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

Article connexe - C++ File