Wie man aus einer Datei in C++ einliest
-
Verwendung von
while
-Schleife und>>
Operator zum Einlesen aus einer Datei in C++ -
Verwendung von die
while
-Schleife und den>>
Operator in Kombination mit derpush_back
-Methode zum Einlesen aus der Datei -
Verwendung von keine
while
-Schleife und keineeof()
Methode zum Einlesen aus einer Datei
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;
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