Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » int & double aus file einlesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.10.2006, 23:47 Uhr
~username2
Gast


hallo,

ich versuche es vergeblich in c++
in mein array aus einer datei meine folgenden werte einzulesen..in jeder zeile steht sowas:
2 3 0.9
3 8 3.8
...

ich habe schon einige threads hier gefunden die mit dem zeilenweisen lesen arbeiten aber keiner ist auf dieses problem zugeschnitten ...kann mir jemand schnell auf die sprünge helfen ?

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: