PDA

Vollständige Version anzeigen : C++ Dateiausgabe


Der_Mosch
01-09-2007, 13:40
Wahrscheinlich ein lächerlicher Fehler, aber ich finde ihn nicht. Warum gibt mein Code das letzte Zeichen einer Datei doppelt aus?


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;


Ich habe übrigens ein Buch gekauft (äusserst preiswert, da Mangelexemplar), in der Hoffnung, daraus ordentliches C++ zu lernen. Ich hab die ersten 326 Seiten übersprungen, weil ich das alles schon wusste, und landete sofort im Anhang. Der Code oben ist fast 1 zu 1 abgeschrieben, nur die Variablen habe ich anders gewählt (und en bissken getrimmt...). Kann ich also von abraten :D

Bernd_XP
01-09-2007, 17:02
Also ich fänds ja ned schlecht, wenn ich die Funktionsweise der Unterprogramme kennen würde ;)

Der_Mosch
01-09-2007, 21:30
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.

Gonzo
02-09-2007, 16:24
Ich bzw. mein VS kann irgendwie mit dem ifstream nix anfangen, von was ist das abgeleitet bzw. welche includes werden dafür verwendet ?

Der_Mosch
02-09-2007, 16:45
ifstream ist ein reiner input file stream aus fstream. Was soll VS abkürzen?

Gonzo
02-09-2007, 21:03
Hmm, wenn du
if(Eingabe.get(zeichen) != 0)
cout << zeichen;

verwendest funktioniert es :)
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 ;)

Der_Mosch
02-09-2007, 22:13
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?

Gonzo
04-09-2007, 17:31
Ganz offensichtlich läuft dat so nicht. Die Frage ist jetzt: Warum nicht?
lol, anscheinend fängst du wirklich erst an c++ zu lernen, die einzigen die dir solche Fragen beantworten könnten sind die von M$, naja, zumindestens wirst du dir solche Fragen in deiner Laufbahn noch des öfteren stellen.
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.

Der_Mosch
05-09-2007, 18:28
Wieso sollte Microsoft mir die Fragen beantworten? Es gibt eine logische Grundstruktur hinter der Schleife.

LordMordred
06-09-2007, 08:30
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.

Gonzo
06-09-2007, 18:25
Wieso sollte Microsoft mir die Fragen beantworten? Es gibt eine logische Grundstruktur hinter der Schleife.
Weil Microsoft die Library und somit auch eof programmiert hat ? Wobei interessant wäre wie sich Linux hier verhält.
#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;
}

Selbst diese Standard-C Version funzt nicht einwandfrei, es wird ein zusätzliches Leerzeichen ausgegeben, der Code sollte eigentlch Linux-Kompatibel sein, falls das also mal jemand testen will ob es sich dort ebenso verhält.
Die MSDN sagt zu feof() folgendes
The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.
Also ist dieses Verhalten wohl beabsichtigt und man MUSS den Rückgabewert der get-Funktion auswerten falls einem die 0 ( Leerzeichen ) am Ende stört.

Der_Mosch
06-09-2007, 20:00
:bang: After, nicht at.
Naja. Blöde Fehler, auch gedanklich, gehören einfach dazu ;) Danke noch mal.