file.good() Verwendung
-
Hallo,
mal eine Frage zum Thema Dateien einlesen.
Ich habe einen fertigen C-Code, der auf verschiedenen System laufen soll, SunOS, Linux Redhat, ...Und zwar kommt im Code oefter mal
while ( (file.good()) bzw. while ( !(file.eof())
vor. Das hat bisher auch immer ganz gut unter einigen Systemen funktioniert. Aber ploetzlich kommt es unter anderen Acoounts dazu, dass immer nur ein und die selbe Zeile gelesen wird. Warum koennte das so sein?
Beste Loesung ist wohl alles mit
getline(file,buffer)
zu ersetzen?
Danke Tim
-
Ohne mehr Code wird dir da wohl kaum jemand helfen können. fstream::good() ist durchaus eine übliche und auch funktionierende Methode.
-
Danke fuer den Hinweis, der Code sieht so aus:
ifstream file(conffile.c_str()); char buffer[512]; string tmp; while (!file.eof()) { file.getline(buffer, 512); tmp = buffer; ... }
oder
ifstream file("file.tmp"); string tmp; char buffer[400]; while (file.good()) { file.getline(buffer, 400); tmp = string(buffer);
bleiben alle in der gleichen Zeile...
Danke
Tim
-
Wie lang sind die Zeilen die du einliest?
Denn wenn das Zeilenende nicht erreicht wird mit den 400 bzw 512 Zeichen, wird file mit einem Fehler markiert und alle weiteren Leseversuche scheitern.Allgemein würde ich dir statt char-Array einen string empfehlen und dies so einlesen, denn da ist die Länge egal:
std::string line; while(file.good()){ getline(file, line); // .... }
EDIT: Evtl. interessant: http://support.microsoft.com/kb/240015
-
Gibt es auch hierfuer eine sinnvolle Alternative:
while(file.good()){ file >> tmp1 >> tmp2 >> tmp3; // read words cout << tmp1 << tmp3; }
Es geht darum, nur immer das erste Wort zu lesen, bis ein Leerzeichen kommt.
Oder muss ich mich da mit substr usw. "abquaelen"?
-
Ich weiß nicht genau was du mit Alternative meinst.
- Willst du nur das erste Wort jeder Zeile haben?
- Willst du nur das x. Wort jeder Zeile haben?
- Willst du nur jedes zweite Wort haben?
- Willst du nur jedes x. Wort haben?etc.pp.
-
Danke fuer deine Hilfe.
Die Zeile in der Datei sieht z.B. so aus:
1: Hallo Welt. Dies ist ein Test" 2: Fuchs du hast die ganz gestohlen. 3: Na gut. Was soll's.
Und ich moechte daraus lesen:
Hallo Welt. Dies Fuchs du hast Na gut. Was
Also immer die ersten 3 Woerter beispielsweise.
-
ups. Natuerlich heisst es die "Gans"!
-
Ich bin mir sicher es geht noch generischer aber mit Hilfe von algorithm und Funktoren geht es recht simpel:
#include <iostream> #include <algorithm> #include <string> #include <fstream> using namespace std; struct ThirdSpace{ ThirdSpace() : n(0){ } int n; bool operator()(char &c){ if (c == ' ') n++; return n == 3; } }; int main(){ ifstream str("third.txt"); string line; while(str.good()){ getline(str, line); string part(line.begin(), find_if(line.begin(), line.end(), ThirdSpace())); cout << part << endl; } }
[bitte kein Beispiel an der miserablen Variablenbenennung etc. nehmen
]
-
Hm, danke fuer die Hilfe.
Prinzipiell brauche ich es doch etwas anders:
Wenn die Datei so aussieht:hallo 123,4 556,3 abc oslo 423,4 656,5 cba ...
und ich
hallo in Variable meinText 123,4 in Variable Wert1 556,3 in Variable Wert2
"transportieren" moechte? Gibt es da was einfaches, ich hatte ueberlegt es mit strtok zu machen, aber weiss nicht, ob das so klappt
-
So liest du es direkt aus der Datei:
string meinText; double Wert1; double Wert2; fstr >> meinText >> Wert1 >> Wert2;
Und wenn du die Zeile schon als String hast:
stringstream sstr(dieZeileAlsString); sstr >> meinText >> Wert1 >> Wert2;
Aber ob 123,456 jetzt als double interpretiert wird, hängt, glaube ich, von der Locale ab. Da kann dir hier aber sicher jemand anders (oder Google) helfen. Nicht mein Gebiet.
-
So, jetzt doch nochmal ein Problem und zwar liest er bei folgenden simplen Programm bis in die Unendlichkeit - woran kann das nur liegen?
Er findet bzw. returned scheinbar kein EOF.ifstream file("test"); string buffer; int i=0; if (file.is_open()) { while (!file.eof()) { cout << "EOF: " << file.eof() << endl; i++; getline(file, buffer); try { cout << i << ": "<< buffer << endl; } catch (exception& ex) { cout << "ERROR READING!" <<endl; } } file.close(); }
-
ich hatte fast vermutet, dass durch
#include <fstream> #include <iostream>
beide Header eventuell das falsche EOF benutzt wird, aber durch
ifstream file(..);
sollte das ja geregelt sein.
Verstehe ich also nicht, wo das Problem liegt...
-
Bei mir funktioniert das von dir gepostete Programm so wie es sollte.
EDIT: Davon abgesehen das das "try" wohl eher auch das getline beinhalten sollte, denn so fängst du nur Exceptions ab die beim Schreiben auftreten könnten.
-
Das ist gerade das kuriose, dass das Programm z.B. einwandfrei unter einem Linux System arbeitet, aber nicht unter einem bestimmten SunOS Acoount.
Irgendwie komm ich da nicht weiter, weil ich nicht weiss, wo der Fehler herkommen koennte.
Wie gesagt er findet einfach kein EOF.