Visual C++ - Textdatei auslesen --> letztes Wort wird doppelt ausgegeben, weshalb?

  • Themenstarter Themenstarter snake-999
  • Beginndatum Beginndatum
S

snake-999

Tach Leute,

hab mich gerade angemeldet, folgendes Problem habe ich:

Undzwar möchte ich nur eine Kleine Datei auslesen mit zwei Wörtern, jedoch gibt er das letzte Wort zweimal aus.

Hier der Code:
Code:
printf("Bitte geben Sie den Dateinamen ein:\n\n");
	do{
		fflush(stdin);
		scanf("%s",dateiname);
		if ((quelle = fopen(dateiname,"r")) == NULL)
		{
			printf("Falscher Dateiname!\n\n");
		}
	}while(!quelle);
	do{
	                if(kontroll != EOF){
		fscanf(quelle,"%s",inhalt);
		printf("%s ",inhalt);
		}
	}while(kontroll = fgetc(quelle) != EOF );

Eine vorhandene Datei soll einfach nur ausgelesen werden.
?ch glaube das mit dem EOF wende ich nicht ganz richtig an.

?n diesem Fall befindet sich die Textdatei natürlich im selben Ordner wie das Projekt.

Danke im Voraus.
 
Hiho und willkommen im Forum,

ich habs jetzt nicht ausprobiert aber meine mich erinnern zu können auch mal so ein ähnliches Phänomen gehabt zu haben.
Versuch mal anstatt einer do..while.. eine while Schleife zu benutzen.

Müsste glaube ich so hinhauen^^
 
danke für deine Antwort... funktieniert leider auch nicht.. dann tritt sogar noch das Problem auf das er den ersten Buchstaben nicht ausgibt.

Beim Befehl fgetc liest er die eine Stelle aus und beim ausgeben verschluckt er diese auch, vielleich hat auch einer dafür noch ne Lösung parat.

Weil in meinem Fall wird eigentlich nicht die richtige formatierung ausgegeben, das leerzeichen muss ich manuell bei der Ausgabe eingeben.

MfG
 
Ok das mit der while Schleife war in nem anderen Zusammenhang :D sry

Hab jetzt aber deinen Code mal bei mir ausprobiert und da funktioniert er einwandfrei.
Post mal deinen Kompletten Quelltext dann kann is nochmal ausprobieren..

(hab Visual Studio 6 benutzt)
 
Code:
#include <stdio.h>

void main()
{
	FILE *quelle;
	char dateiname[20];
	char inhalt[20];
	int kontroll = 0;

	printf("Bitte geben Sie den Dateinamen ein:\n\n");
	do{
	
		fflush(stdin);
		scanf("%s",dateiname);

		if ((quelle = fopen(dateiname,"r")) == NULL)
		{
			printf("Falscher Dateiname!\n\n");
		}

	}while(!quelle);

	do{
		if(kontroll != EOF){
		fscanf(quelle,"%s",inhalt);
		printf("%s ",inhalt);
		}
	}while(kontroll = fgetc(quelle) != EOF );

}
Dann bitte ich dich auch mal eine test datei zu erstellen und einfach "hallo ich" schreiben.
2 getrennte Wörter dann müsste er bei dir auch das 2 Wort eigentich doppelt ausgeben.

?ch benutze ebenfalls VS 6..
 
Also hab eine Test Datei angelegt zuerst ging es weider einwandfrei dann hab ich was ausprobiert und es scheint wohl daran zu liegen das du eine Leerzeile in deiner Datei hast die ich nicht hatte, sprich du hast mit ENTER die Zeile abgeschlossen und ich nicht. Muss also irgendwas mit der newline zu tun haben denk ich mal.. ich schau mal ob ich es hinbekomm.. moment :D


[EDIT]:

Habs jetzt auf die schnelle au net hinbekommen schau morgen nochmal falls no keine Lösung hast.
aber vielleicht hat ja jemand anderes ne Idee wie man die Leere Zeile überspringt.. vielleicht Anzahl der Zeichen auslesen oder so.. kannst ja mal verschiedene Sachen ausprobieren. Viel Glück
 
Zuletzt bearbeitet:
ja stimmt daran lags und ich dachte der Compiler sieht das folgende Zeichen automatisch als eine Leertaste...
naja jedoch ist das ne magere Lösung:).. es müsste ja auch irgendwie anders funktionieren, hab da ein paar sachen im Kopf probiere die aus und meld mich dann auch wieder....aber erst morgen...

bis dann....


EDIT:

ich habs leider nicht hinbekommen.

Code:
while(kontroll = fgetc(quelle) != EOF )

wenn die fgetc Funktion benutzt wird, und die jeweilige STelle ausgelesen wird, ist kann man nicht auf diese Stelle zugreifen...

ich hoffe das ich mich bei diesem Problem verstaendlich asdrücken konnte:)
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

das letzte Wort wird zweimal ausgegeben, weil der letzte "fscanf()" - Aufruf keine Daten mehr nach "inhalt" schreibt, dort aber noch die vorherigen Daten enthalten sind. Vor der Ausgabe mit "printf()" musst du erstmal prüfen, ob "fscanf()" überhaupt erfolgreich war.

Die Überprüfen mit EOF ist tatsächlich nicht das Gelbe vom Ei :)
Dafür gibt es auch eine spezielle Funktion.
C++:
do
{
    if( fscanf(quelle, "%s", inhalt) > 0 )
    {
        printf("%s ", inhalt);
    }                
    
} while( !feof(quelle) );
Gruß
MCoder
 
Geht doch.. wieder was dazu gelernt, dankeschön:D....

...............................

und zack das neachste Problem:)

ich sollte eigentlich noch bei der FOrmatierung der Ausgabe machen, habe jedoch mit der Eingabe angefangen:

Code:
	do{

		fflush(stdin);
		scanf("%s",newText);
		vergleich = getch();

	}while(vergleich == 32);

	fputs(newText,quelle);
ich kann immer nur ein Wort eingebender rest verscwhindet und beim anhaengen schreibt er es direkt an das letzte Wort.

MfG
 
Zuletzt bearbeitet von einem Moderator:
Sauber MCoder so ähnlich hab is au versucht nur ohne < 0 :( ^^

@ Topic sry aber versteh deine Frage nicht...
 
Zurück