Datei in String einlesen in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden von istreambuf_iterator zum Einlesen einer Datei in einen String in C++
  2. Verwenden von rdbuf zum Lesen einer Datei in einen String in C++
  3. Verwenden Sie fread, um eine Datei in eine Zeichenkette zu lesen
  4. Verwenden Sie read, um eine Datei in eine Zeichenkette zu lesen
Datei in String einlesen in C++

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:

  1. Einen Zeiger auf den Puffer, in dem die gelesenen Daten gespeichert werden.
  2. Die Größe des Datenelements.
  3. Anzahl der Datenelemente
  4. 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);
}
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