cin.get(ch) einlesen von Zeichen

Roncalli

Grünschnabel
Hallo! Ich habe hier ein kleines Programm, dass Zeichen einlesen soll.
Da ich gucken wollte, ob er richtig einließt, habe ich mir die Eingabe mittels cout<< anzeigen lassen.nun schreibt er aber:
Anstatt
1.6.2000, Donnerstag
3.7.2001, Dienstag

das hier
1.6.2000, Donnerstag
3.7.2001, Dienstagg

Habe ich einen Fehler bei der Eingabe oder bei der Ausgabe?
Sinn des Programms soll werden, dass die Ausgabe mal so aussieht:
Donnerstag, den 1.6.2000
Dienstag, den 3.7.2001

nur wenn die eingabe schon nicht stimmt, kann die ausgabe ja erst recht nicht stimmen.

Code:
#include <stdio.h>
#include <fstream>
#include <iostream>

using namespace std;

int main()
{
	ifstream ein;
	ein.open("c:\\temp\\Datum.txt");
	if (!ein.good()) return 0;
	char* feld= new char[100];
	char ch;
	int i=0,e=0;

	while (!ein.eof())
	{
		ein.get(ch);
		feld[i]=ch;
		i++;
		cout<<ch;
		
	}

system("pause");
return 0;
}


Vielleicht kann mir jmd auch einen Tipp geben, wie man am geschicktesten die Sache oben umdreht! habe da noch nicht wirklich ne gute idee.:confused:
 
Hi.

Dein Fehler ist die Verwendung der .eof() Methode die sich leider seit Jahren hält und sogar in Büchern falsch bzw. gar nicht erklärt und doch verwendet wird.

Es ist ja so: du hast eine Schleife und prüfst ob .eof() falsch ist, dann versuchst du ein Zeichen zu lesen. Du kannst aber gar nicht wissen ob das auch erfolgreich war.

Das Einlesen von einem Stream ist immer ein Versuch. Man kann nicht davon ausgehen das es gelingt. (auch wenn vorher eof() noch falsch war - es können auch noch andere Fehler auftreten - dann hast du eine Endlosschleife programmiert)

C++:
while (ein.get(ch)) {
  feld[i]=ch;
  i++;
  cout << ch;
}
Gruß

PS: Und wenn du prüfen willst, ob die Datei geöffnet ist, dann nimm besser die is_open() Methode.
 
Zuletzt bearbeitet:
Vielen Dank!
Funktioniert tadellos.

Also sollte ich generell davon absehen, Schleifen zu bauen die bis EOF gehn?

Woher weiss die Schleife denn jetzt, wann sie aufhören soll zu lesen?
 
Also sollte ich generell davon absehen, Schleifen zu bauen die bis EOF gehn?
Du solltest in C++ auf jeden Fall davon absehen die .eof() Methode in einer Schleifenbedingung zu prüfen.
Woher weiss die Schleife denn jetzt, wann sie aufhören soll zu lesen?
Die Schleife "weiß" gar nichts - sie ist kein Lebewesen.

Die Schleife prüft lediglich die Bedingung und führt den Schleifenblock aus falls die Bedingung wahr ist. Als Bedingung ist dort eine Anweisung angegeben die versucht ein Zeichen einzulesen. Falls das geklappt hat, wird ein Wert zurückgegeben, der wahr ist, anderenfalls wird falsch zurückgegeben so dass die Schleife dann abbricht.

Im Grunde steht es direkt da:
Code:
solange wie cin.get(ch) erfolgreich ist, tue....
Die Schleife läuft also solange bis das Einlesen eines Zeichens fehl schlägt. Das kann verschiedene Gründe haben, wie z.B. EOF oder einen anderen Fehler.

Gruß
 
danke, würde es so, wie du es beschreibst, auch mal in den ganzen büchern drin stehen, könnte ich auch c++ mal begreifen.
 
Zurück