Datei in String einlesen in C++
-
Verwenden von
istreambuf_iterator
zum Einlesen einer Datei in einen String in C++ -
Verwenden von
rdbuf
zum Lesen einer Datei in einen String in C++ -
Verwenden Sie
fread
, um eine Datei in eine Zeichenkette zu lesen -
Verwenden Sie
read
, um eine Datei in eine Zeichenkette zu lesen
In diesem Artikel werden mehrere Methoden zum Lesen des Dateiinhalts in einen std::string
in C++ erklärt.
Verwenden von istreambuf_iterator
zum Einlesen einer Datei in einen String in C++
istreambuf_iterator
ist ein Eingabe-Iterator, der aufeinanderfolgende Zeichen aus dem Objekt std::basic_streambuf
liest. So können wir istreambuf_iterator
mit einem ifstream
-Stream verwenden und den gesamten Inhalt der Datei in einen std::string
einlesen.
Zunächst öffnen wir einen gegebenen Dateipfad als ifstream
-Objekt. Dann können wir istreambuf_iterator<char>(input_file)
an den string
-Konstruktor übergeben und erhalten das Objekt, das wir an erster Stelle benötigten. Beachten Sie, dass wir die string
-Konstruktoranweisung direkt übergeben, um von der Funktion zurückzukehren. Die Ausgabe des Programms sollte der Inhalt der Datei sein, wie er in der Variablen filename
angegeben ist.
#include <fstream>
#include <iostream>
#include <sstream>
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::ostringstream;
using std::string;
string readFileIntoString(const string& path) {
ifstream input_file(path);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << path << "'" << endl;
exit(EXIT_FAILURE);
}
return string((std::istreambuf_iterator<char>(input_file)),
std::istreambuf_iterator<char>());
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
Verwenden von rdbuf
zum Lesen einer Datei in einen String in C++
Die Funktion rdbuf
ist eine eingebaute Methode, um einen Zeiger auf den Stream-Puffer der Datei zurückzugeben, was nützlich ist, um den gesamten Inhalt der Datei mit dem Operator <<
in das benötigte Objekt einzufügen.
Im folgenden Beispiel konstruieren wir ein ostringstream
-Objekt, in das wir den Rückgabewert der Funktion rdbuf
einfügen. Die Funktion selbst gibt das Objekt string
zurück, also wird die Methode str
verwendet, um den endgültigen Rückgabewert zu erhalten.
#include <fstream>
#include <iostream>
#include <sstream>
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::ostringstream;
using std::string;
string readFileIntoString2(const string& path) {
auto ss = ostringstream{};
ifstream input_file(path);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << path << "'" << endl;
exit(EXIT_FAILURE);
}
ss << input_file.rdbuf();
return ss.str();
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString2(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
Verwenden Sie fread
, um eine Datei in eine Zeichenkette zu lesen
Eine weitere Methode zum Lesen einer Datei ist die C-Standardbibliotheksfunktion fread
. Diese Methode erfordert relativ veraltete Funktionen, die in den modernen C++-Codebasen nicht üblich sind, aber sie bietet im Vergleich zu den vorherigen Methoden eine erhebliche Leistungssteigerung.
fread
nimmt vier Argumente entgegen:
- Einen Zeiger auf den Puffer, in dem die gelesenen Daten gespeichert werden.
- Die Größe des Datenelements.
- Anzahl der Datenelemente
- Der Dateizeiger, aus dem gelesen werden soll.
Da wir die gesamte Datei lesen, muss die Dateigröße abgerufen werden, und das wird mit dem Unix-Systemaufruf stat
implementiert. Sobald die Dateigröße abgerufen ist, übergeben wir ihren Wert als Größe des Datenelements an die Funktion fread
, und als Anzahl der Datenelemente geben wir 1
an.
Beachten Sie, dass geöffnete Dateien mit dem Funktionsaufruf fclose
geschlossen werden müssen, der als einziges Argument den Dateizeiger entgegennimmt.
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
using std::cerr;
using std::cout;
using std::endl;
using std::string;
string readFileIntoString3(const string& path) {
struct stat sb {};
string res;
FILE* input_file = fopen(path.c_str(), "r");
if (input_file == nullptr) {
perror("fopen");
}
stat(path.c_str(), &sb);
res.resize(sb.st_size);
fread(const_cast<char*>(res.data()), sb.st_size, 1, input_file);
fclose(input_file);
return res;
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString3(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
Verwenden Sie read
, um eine Datei in eine Zeichenkette zu lesen
Die Methode read
ist ein POSIX-konformer Funktionsaufruf, der auf verschiedenen Betriebssystemen verfügbar ist und der flexibelste sein kann, wenn der Programmierer weiß, wie man ihn effizient einsetzt. fread
selbst ruft read
darunter auf, aber das garantiert nicht in allen Fällen eine schnellere Operation, da mehrere Faktoren bei der effizienten Nutzung solcher Systemaufrufe eine Rolle spielen.
Der Hauptunterschied zu fread
besteht darin, dass read
ein Dateideskriptor-Argument benötigt, um auf die Datei zu zeigen, aus der Daten gelesen werden sollen. Dateideskriptoren sind spezielle Ganzzahlen, die mit den offenen Dateiströmen verbunden sind, die das Programm während der Ausführung haben könnte. Sie können mit dem Funktionsaufruf open
erfasst und im Typ int
gespeichert werden. Die beiden anderen Argumente der Funktion read
sind der Zeiger auf den Puffer, in dem die Daten gespeichert werden sollen, und die Anzahl der zu lesenden Bytes, wobei letztere mit dem Funktionsaufruf fstat
abgerufen wird. Beachten Sie, dass wir die String.data
als Puffer zum Speichern der gelesenen Dateiinhalte verwenden.
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
using std::cerr;
using std::cout;
using std::endl;
using std::string;
string readFileIntoString4(const string& path) {
struct stat sb {};
string res;
int fd = open(path.c_str(), O_RDONLY);
if (fd < 0) {
perror("open\n");
}
fstat(fd, &sb);
res.resize(sb.st_size);
read(fd, (char*)(res.data()), sb.st_size);
close(fd);
return res;
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString4(filename);
cout << file_contents << endl;
exit(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