Datei Wort für Wort in C++ lesen
-
Verwenden von
std::ifstream
zum wortweisen Lesen einer Datei in C++ -
Verwendung der Funktionen
std::ispunct
undstd::string::erase
zum Parsen von Interpunktionszeichen in C++
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;
}
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