Leggere file parola per parola in C++

Jinku Hu 12 ottobre 2023
  1. Usare std::ifstream per leggere un file parola per parola in C++
  2. Usa le funzioni std::ispunct e std::string::erase per analizzare i simboli di punteggiatura in C++
Leggere file parola per parola 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;
}
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