#1
|
||||
|
||||
C++ Dateiausgabe
Wahrscheinlich ein lächerlicher Fehler, aber ich finde ihn nicht. Warum gibt mein Code das letzte Zeichen einer Datei doppelt aus?
Code:
ifstream Eingabe; Eingabe.open(Datei.c_str(), ios_base::in); cout << "\nGebe Datei aus: \n"; char zeichen; while (!Eingabe.eof()) { Eingabe.get(zeichen); cout << zeichen; } Eingabe.close(); cout << endl; ![]()
__________________
I ELUCIDATE THE TRUTH OF A CASE FROM NOW ON! |
#2
|
||||
|
||||
Also ich fänds ja ned schlecht, wenn ich die Funktionsweise der Unterprogramme kennen würde
![]()
__________________
Nach der GetBoinked5 von [Unbekannt]: "Ich hab aus Gewohnheit und Versehen zu meiner Freundin gesagt: Thekenschlampe bring mir noch n Bier" |
#3
|
||||
|
||||
Definiere "Unterprogramm". Das ist schon alles. Eigentlich fehlt nur die Deklaration von "Datei" (ist ein String, der den Dateinamen enthält) und der Rest des Programms ist dafür nicht relevant, weil auf nichts darin noch einmal referenziert wird.
Übrigens, mal prophylaktisch: Ich weiss, dass man das auch anders ausgeben kann, habs im Endeffekt auch über cout gemacht, aber ich würde gerne wissen, warum der oben stehende Code nicht funktioniert, wei er soll.
__________________
I ELUCIDATE THE TRUTH OF A CASE FROM NOW ON! |
#4
|
||||
|
||||
Ich bzw. mein VS kann irgendwie mit dem ifstream nix anfangen, von was ist das abgeleitet bzw. welche includes werden dafür verwendet ?
|
#5
|
||||
|
||||
ifstream ist ein reiner input file stream aus fstream. Was soll VS abkürzen?
__________________
I ELUCIDATE THE TRUTH OF A CASE FROM NOW ON! |
#6
|
||||
|
||||
Hmm, wenn du
Code:
if(Eingabe.get(zeichen) != 0) cout << zeichen; ![]() Warum es mit nur while nicht funzt, kann ich nicht wirklich erklären, vermute nur dass die Datei nach dem Lesen des letzten Zeichens halt noch nicht eof ist, sondern erst eines später, deshalb wird das letzte Zeichen doppelt ausgegeben ( get schlägt fehl und zeichen bleibt unverändert ). VS = Visual Studio ![]() |
#7
|
||||
|
||||
Ah ja, Visual Studio C++ benutze ich auch
![]() Ich weiss, dass es mehrere Wege gibt, das auszugeben, ich weiss nur nicht, warum dieser eine hier nicht funktioniert. Was ja eigentlich passieren müsste: While-Abfrage -> nicht Ende der Datei -> Kopieren und Ausgabe -> Wiederhole... -> While-Abfrage -> Letztes Zeichen=Nicht Ende -> Kopieren und Ausgabe -> While-Abfrage -> Ende der Datei -> Rest von While wird übersprungen. Ganz offensichtlich läuft dat so nicht. Die Frage ist jetzt: Warum nicht?
__________________
I ELUCIDATE THE TRUTH OF A CASE FROM NOW ON! |
#8
|
||||
|
||||
Zitat:
Einfach die Lösung akzeptieren, über M$ fluchen, Mund abwischen und weitermachen ![]() Ach ja, ich persönlich finde c++ zum würgen, viel zu kompliziert, ich bevorzuge eindeutig das klassische c, und wenn man sich an dem Framework nicht stört ist c# die deutlich einfachere objektorientierte Variante ![]() Komplilieren tue ich den c-code übrigens immer als c++-code, das lässt einem alle Möglichkeiten offen falls man mal eine Problemlösung nur als c++ findet. |
#9
|
||||
|
||||
Wieso sollte Microsoft mir die Fragen beantworten? Es gibt eine logische Grundstruktur hinter der Schleife.
__________________
I ELUCIDATE THE TRUTH OF A CASE FROM NOW ON! |
#10
|
||||
|
||||
Das stimmt, doch die Frage ist, wann EOF wirklich zurückgegeben wird bzw. erkannt wird.
Aber wie das in C++ genau ist, kann ich dir leider nicht sagen, da ich mich entweder mit C oder mit C# verständige.
__________________
![]() _______________________________________________________________ "Ich kann freilich nicht sagen, ob es besser werden wird, wenn es anders wird; aber soviel kann ich sagen: es muß anders werden, wenn es gut werden soll."(Georg Christoph Lichtenberg *1742 †1799) "Demokratie ist die Notwendigkeit, sich gelegentlich den Ansichten anderer Leute zu beugen." (Winston Churchill *1874 †1965) "Zwei Monologe, die sich gegenseitig immer und immer wieder störend unterbrechen, nennt man eine Diskussion." (Charles Tschopp *1899 †1982) |
#11
|
||||
|
||||
Zitat:
Code:
#include <io.h> #include <stdio.h> int main() { FILE *file; char ch; if(!(file = fopen("c:\\test.txt", "rb"))) { printf("Unable to open file\n"); return 1; } while(!feof(file)) { ch = (char)fgetc(file); printf("%c", ch); } fclose(file); getchar(); return 0; } Die MSDN sagt zu feof() folgendes Zitat:
|
#12
|
||||
|
||||
![]() Naja. Blöde Fehler, auch gedanklich, gehören einfach dazu ![]()
__________________
I ELUCIDATE THE TRUTH OF A CASE FROM NOW ON! |