Wie man aus einer Datei in C++ einliest

Jinku Hu 12 Oktober 2023
  1. Verwendung von while-Schleife und >> Operator zum Einlesen aus einer Datei in C++
  2. Verwendung von die while-Schleife und den >> Operator in Kombination mit der push_back-Methode zum Einlesen aus der Datei
  3. Verwendung von keine while-Schleife und keine eof() Methode zum Einlesen aus einer Datei
Wie man aus einer Datei in C++ einliest

Dieser Artikel erklärt verschiedene C++-Methoden zum Lesen von int-Daten aus einer Datei.

In den folgenden Beispielprogrammen gehen wir davon aus, daß eine Textdatei mit dem Namen input.txt vorliegt, die durch Leerzeichen getrennte Ganzzahlen auf mehreren Zeilen enthält. Beachten Sie, daß jeder Beispielcode prüft, ob dieser Dateiname mit dem tatsächlichen Datei-Stream in Verbindung gebracht wird, und im Fehlerfall die entsprechende Fehlermeldung ausgibt.

  • Inhalt von input.txt:
123 178 1289 39 90 89 267 909 23 154 377 34 974 322

Verwendung von while-Schleife und >> Operator zum Einlesen aus einer Datei in C++

Diese Methode verwendet die while-Schleife, um den Prozess zu iterieren, bis das EOF (Ende der Datei) erreicht ist, und speichert jede ganze Zahl in der Zahlenvariablen. Dann können wir jede Zahl als Konsole im Schleifenrumpf ausgeben.

#include <fstream>
#include <iostream>

using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::string;

int main() {
  string filename("input.txt");
  int number;

  ifstream input_file(filename);
  if (!input_file.is_open()) {
    cerr << "Could not open the file - '" << filename << "'" << endl;
    return EXIT_FAILURE;
  }

  while (input_file >> number) {
    cout << number << "; ";
  }
  cout << endl;
  input_file.close();

  return EXIT_SUCCESS;
}

Ausgabe:

123; 178; 1289; 39; 90; 89; 267; 909; 23; 154; 377; 34; 974; 322;

Verwendung von die while-Schleife und den >> Operator in Kombination mit der push_back-Methode zum Einlesen aus der Datei

Als weitere Alternative kann man jede Ganzzahl aus der Datei holen, sie wie im vorigen Beispiel in der Zahlenvariablen speichern und sie dann in jeder Iteration auf den int-Vektor schieben. Beachten Sie, dass dieses Szenario eine weitere for-Schleife enthält, um das praktischere System zu imitieren, bei dem die Elemente der gespeicherten Vektor-Zahlen manipuliert werden müssen.

#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<int> numbers;
  int number;

  ifstream input_file(filename);
  if (!input_file.is_open()) {
    cerr << "Could not open the file - '" << filename << "'" << endl;
    return EXIT_FAILURE;
  }

  while (input_file >> number) {
    numbers.push_back(number);
  }

  for (const auto &i : numbers) {
    cout << i << "; ";
  }
  cout << endl;
  input_file.close();

  return EXIT_SUCCESS;
}

Ausgabe:

123; 178; 1289; 39; 90; 89; 267; 909; 23; 154; 377; 34; 974; 322;

Verwendung von keine while-Schleife und keine eof() Methode zum Einlesen aus einer Datei

Man könnte erwägen, die eof() Memberfunktion als eine while Schleifenbedingung zu verwenden, um sich dem gleichen Problem zu nähern. Leider kann das zu einer zusätzlichen Iteration führen. Da die Funktion eof() nur dann true zurückgibt, wenn das eofbit gesetzt ist, könnte dies zu der Iteration führen, bei der uninitialisiert modifiziert wird. Dieses Szenario wird durch das folgende Code-Beispiel veranschaulicht:

#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<int> numbers;

  ifstream input_file(filename);
  if (!input_file.is_open()) {
    cerr << "Could not open the file - '" << filename << "'" << endl;
    return EXIT_FAILURE;
  }

  while (!input_file.eof()) {
    int tmp;
    input_file >> tmp;
    numbers.push_back(tmp);
  }

  for (const auto &i : numbers) {
    cout << i << "; ";
  }
  cout << endl;
  input_file.close();

  return EXIT_SUCCESS;
}

Ausgabe:

123; 178; 1289; 39; 90; 89; 267; 909; 23; 154; 377; 34; 974; 322;
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