001
29.10.2006, 00:12 Uhr
0xdeadbeef
Gott (Operator)
|
In dem Fall gibts drei Möglichkeiten, abhängig davon, wie sicher du sein kannst, dass die Datei nicht kaputt ist. Zuerst mal definiere ich für nen Datensatz ne Struktur, die benutz ich in allen Beispielen:
C++: |
struct dataset { int m, n; double d; };
|
Je nachdem, was die Zahlen bedeuten, bieten sich natürlich andere Namen an. Also - die einfachste Möglichkeit wäre, einfach stumpf Zahlen hintereinander einzulesen. Das heißt
C++: |
#include <istream>
istream &operator>>(istream &file, dataset &ds) { return file >> ds.m >> ds.n >> ds.n; }
// ...
ifstream my_file("datei.txt"); std::vector<dataset> v; // dafür #include <vector>
while(!my_file.eof()) { dataset dat; my_file >> dat; v.push_back(dat); }
|
Allerdings läufst du damit in Probleme, wenn die Datei kaputt ist, also z.B. wenn dir jemand sowas wie
C++: |
1 2 3.0 4 5 6 7 8.0 abc
|
unterschiebt. Eine Möglichkeit, dagegen vorzugehen, ist, die Datei zeilenweise zu verarbeiten. In dem Fall sähe der operator>> so aus:
C++: |
#include <istream> #include <sstream> #include <string>
istream &operator>>(istream &in, dataset &ds) { std::string line; std::istringstream isstr;
std::getline(in, line); isstr.str(line); isstr >> ds.m >> ds.n >> ds.d;
return in; }
|
Die dritte und sicherste Möglichkeit ist, nen Parser zu bauen, der die Datei vorher schon überprüft. Dafür emfpiehlt sich im Zweifel boost.spirit, allerdings wird das dann schon ne Ecke komplizierter, von daher geb ich dafür kein Beispiel an. Schlag das halt einfach mal auf www.boost.org nach. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |