ifstream | letzter Buchstabe doppelt
-
Mh, verstanden hab ich das Problem jetzt schon, er reagiert nicht darauf, dass er den letzten Bcuhstaben gelesen hat, sondern er reagiert darauf wenn er merkt das kein Buchstabe mehr da ist, und es halt leer ist.
Aber wie ich das Problem lösen kann hab ich nicht so ganz verstanden?
Ich kann natürlich jetzt bei jedem Wort immer den letzten Buchstaben abschneiden, aber ob das eine so glorreiche Idee ist bezweifle ich oder? Da gibts doch sicher was besseres....
MfG
Stromberg
-
Nach dem Lesen mußt du abfragen, ob du die Daten noch verarbeiten kannst:
while(!File.eof()) { File >> a; if(!File.eof()) cout << a; }oder eleganter:
#include <iostream> #include <fstream> using namespace std; int main() { char a; ifstream File; File.open("D:/test.txt", ios::in); File >> a; while(!File.eof()) { cout << a; File >> a; } cout << "\n"; return 0; }Gruß,
CSpille
-
Den Status des Streams kannst du einfach mit dem impliziten (void
Operator testen:while(File) // <- istream::operator void*() { File >> c; }Die Abfrage auf eof() ist nicht so gut, da es noch andere Fehlerzustände gibt, welche dann nicht getestet würden und du eine Endlosschleife hättest...
-
Th schrieb:
Den Status des Streams kannst du einfach mit dem impliziten (void
Operator testen:while(File) // <- istream::operator void*() { File >> c; }Die Abfrage auf eof() ist nicht so gut, da es noch andere Fehlerzustände gibt, welche dann nicht getestet würden und du eine Endlosschleife hättest...
Cool...
Die Abfrage mit dem impliziten (void
operator kannte ich auch noch nicht.
Dass andere Fehler existieren können (failbit, badbit), war mir klar.
Ehrlich gesagt hab ich diese aber bisher immer ignoriert ^^, da sie sehr selten
auftreten und man ja schreibfaul ist
EDIT: btw: Ich hätte ja schon immer einfach good() abfragen können.Danke für den interessanten Hinweis
-
Dann ists so wohl am besten:
#include <iostream> #include <fstream> using namespace std; int main() { char a; ifstream File; File.open("D:/test.txt", ios::in); File >> a; //Nur die Zeile hier finde ich noch irgendwie hässlich, gibts keine Möglichkeit dass man alles in die Schleife bekommt? while(File) { cout << a; File >> a; } cout << "\n"; return 0; }MfG
Stromberg
-
Hallo Stromberg,
es gibt immer mehrere Möglichkeiten.
int main() { char a; ifstream File; File.open("D:/test.txt", ios::in); while(true) { File >> a; if(!File) break; cout << a; } cout << "\n"; return 0; }Diese Variante mit break finde ich persönlich nicht schön.
Oder wie gesagt die doppelte Überprüfung (bei Bedarf mit Status-Speicherung)int main() { char a; ifstream File; File.open("D:/test.txt", ios::in); bool state = true; while(state) { File >> a; state = File; if(state) cout << a; } cout << "\n"; return 0; }Welche Variante man bevorzugt ist natürlich Geschmacksache.
Ich denke allerdings nicht, dass du an zwei Leseoperationen, zwei eof-Prüfungen
oder einem break vorbeikommst.Gruß,
CSpille
-
Also noch mal in Kürze.
Es reicht folgende Schleife:while(File >> c) // <- istream::operator void*() { cout << c; }Da jedoch der >>-Operator standardmäßig Leerzeichen überliest, sollte man dann doch besser get() benutzen (um die Zeichen 1:1 zu kopieren):
while(c = File.get(), File) { cout << c; }Alternativ kann man auch zeilenweise mit getline(...) in einen std::string lesen.
-
Und für die, die das alles zu blöde finden:
#include <fstream> #include <iostream> #include <algorithm> #include <iterator> int main() { std::ifstream file_stream("D:\\test.txt"); if (!file_stream) { std::cerr << "FEHLER: Datei konnte nicht geöffnet werden!" << std::endl; return 1; } std::copy(std::istream_iterator<char>(file_stream), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout, ""); }
-
warum endl?

-
rdbuf()