PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: datei einlesen



Sector1379
02-01-2007, 17:02
Hallo zusammen ,

ich habe folgendes Problem ich will eine datei einlesen in der ich jeden string zunächst untersuchen muss um ihn dann weiter verarbeiten zu können.

Nun lese ich ganz normal mit getline die erste zeile ein hier mal der code block:


void read_from_file(Artikel **artikel){

string line;
ifstream input_file("data");

while(!input_file.eof()){

getline(input_file, line);
string::size_type elek = line.find("elektro,");
int used = Artikel::artikelAnzahl();

if(!(elek == string::npos)){
artikel[used] = new ElektroArtikel;;
input_file >>*artikel[used];
}

}

input_file.close();

}


So nun ich das Problem das die function für die Operator überladung wieder sich eine Zeile holt um diese dann zu verarbeiten. Und genau da ist das Problem da ich ja schon mal getline genutzt habe und ich wieder getline über eine referenz mache bin ich dann nicht in der zeile für die die bedinung stimmt sondern in der nächsten. Wie kann nun quasi in der weiter verarbeitung in die vorletzte zeile springen ??? Ich darf die Prototypen nicht verändern die stehen so fest.

Hier noch mal die andern code schnipsel.


void ElektroArtikel::eingabeDatei( istream& ein ){

string line;
cout << line << endl; // das ist nur mal schnell zum tesen für die zeilen hier kommt nacher die richtige verarbeitung
}


istream& operator>> ( istream& ein, Artikel& arti ){

string art_num, art_preis, art_bez;

if(typeid(ein) == typeid(ifstream)) arti.eingabeDatei(ein);
}

Ich hoffe mir kann jemad von euch da weiter helfen. Ich würde mich jedenfalls riesig freuen denn ich sitzte schon stunden an diesem zeilen Problem.

Fabeltier
02-01-2007, 19:56
Allgemein zu eof faellt mir ein, dass eine alleinige Pruefung auf eof eigentlich gar nicht exakt das macht, was Du hier machen willst. Es ergeben sich einige Gefahrenquellen und auch das Verhalten "eins weiter" zu lesen haengt damit zusammen, vllt hilft Dir dieser Artikel weiter:
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=eof#Answ

Ansonsten wurde mir bei Filestreams immer auch mal zur Verwendung einer der Boost Libraries geraten: http://www.boost.org/. Diese scheinen in vielen Faellen "State of the Art" zu sein und wurden wohl zum Teil auch schon in die STL aufgenommen bzw. stehen Teile davon kurz davor, vllt lohnt sich fuer Dich auch ein Blick darauf.

locus vivendi
02-01-2007, 20:04
So nun ich das Problem das die function für die Operator überladung wieder sich eine Zeile holt um diese dann zu verarbeiten. Und genau da ist das Problem da ich ja schon mal getline genutzt habe und ich wieder getline über eine referenz mache bin ich dann nicht in der zeile für die die bedinung stimmt sondern in der nächsten. Wie kann nun quasi in der weiter verarbeitung in die vorletzte zeile springen ???
Das einfachste wäre doch, die vorletzte Zeile einfach in einem weiteren String zwischenzuspeichern. Oder geht das nicht? Möglich wäre es aber auch, jeweils vor dem Einlesen einer Zeile die aktuelle Position im Stream zu speichern, und dann ggf. dorthin zurückzuspulen. Dazu könntest du dir die Memberfunktionen seekg und tellg von basic_istream anschauen.

Noch ein recht wichtiger Punkt, den ich in diesem Forum schon mehrfach erwähnt habe, das hier,

while(!input_file.eof()){ [...] }, ist unzuverlässig. Man kann ja nicht immer im Voraus sagen, ob noch ein weiteres Zeichen zum lesen da ist. Korrekt wäre es, erst das Lesen zu versuchen, und dann zu überprüfen ob es erfolgreich war. Insbesondere muss man dabei auch überprüfen, ob nicht vielleicht auch ein Fehler aufgetreten ist. In dem Fall muss nicht zwangsläufig EOF gesetzt sein.