Datei Wort für Wort in C++ lesen

Jinku Hu 12 Oktober 2023
  1. Verwenden von std::ifstream zum wortweisen Lesen einer Datei in C++
  2. Verwendung der Funktionen std::ispunct und std::string::erase zum Parsen von Interpunktionszeichen in C++
Datei Wort für Wort in C++ lesen

Dieser Artikel zeigt verschiedene Methoden zum wortweisen Lesen einer Datei in C++.

Verwenden von std::ifstream zum wortweisen Lesen einer Datei in C++

Die Klasse std::ifstream kann verwendet werden, um dateibasierte Streams für Eingabeoperationen durchzuführen. Der Typ std::ifstream wird nämlich verwendet, um eine Schnittstelle mit dem Dateipuffer herzustellen und ihn mit dem Extraktionsoperator zu bearbeiten. Beachten Sie, dass der Typ std::fstream auch in der E/A-Bibliothek enthalten ist, der sowohl mit Extraktions- (>>) als auch mit Einfügeoperatoren (<<) kompatibel ist.

Zuerst müssen wir ein Objekt vom Typ ifstream erstellen, indem wir einen seiner Konstruktoren aufrufen. In diesem Fall wird nur die DateinamenZeichenkette an die Konstruktorfunktion übergeben. Sobald das Objekt ifstream erstellt wurde, sollte eine seiner Methoden - is_open - aufgerufen werden, um zu überprüfen, ob der Aufruf erfolgreich war, und anschließend den Dateiinhalt zu lesen.

Um die Datei Wort für Wort zu lesen, rufen wir den Extraktionsoperator für das Objekt ifstream auf. Wir leiten es an die Zeichenkettenvariable weiter, die automatisch das erste Wort einliest, bevor das erste Leerzeichen gefunden wird. Da wir jedes Wort bis zum Ende der Datei lesen müssen, fügen wir die Extraktionsanweisung in einen while-Schleifenausdruck ein. Zusätzlich haben wir einen Vektor von Zeichenketten deklariert, um jedes Wort bei jeder Iteration zu speichern und später mit einem separaten Schleifenblock zu drucken.

#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;
}

Verwendung der Funktionen std::ispunct und std::string::erase zum Parsen von Interpunktionszeichen in C++

Der einzige Nachteil der vorherigen Methode besteht darin, dass die Satzzeichen in der Nähe von Wörtern im Ziel Vektor gespeichert werden. Es wäre besser, jedes Wort zu analysieren und es dann in einem Vektor-Container zu speichern. Wir verwenden die Funktion ispunct, die ein einzelnes Zeichen als int-Parameter verwendet und einen ganzzahligen Wert ungleich Null zurückgibt, wenn das Zeichen Interpunktion ist. Andernfalls wird Null zurückgegeben.

Beachten Sie, dass das Verhalten der Funktion ispunct undefiniert ist, wenn das angegebene Argument nicht als unsigned char dargestellt werden kann. Daher wird empfohlen, das Zeichen in den entsprechenden Typ umzuwandeln. Im folgenden Beispiel haben wir die beiden einfachen if-Bedingungen implementiert, um das erste und das letzte Zeichen jedes Wortes zu überprüfen. Wenn die Interpunktion gefunden wird, rufen wir eine integrierte Zeichenkettenfunktion auf - löschen, um die gefundenen Zeichen zu entfernen.

#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;
}
Autor: 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

Verwandter Artikel - C++ File