Programm gibt Fehler aus



  • erstmal der code (weiss nich wo genau das liegt)

    ...//nervt beim scrollen ^^'
    }
    }
    

    (hab etwas abgekürzt
    also bei meinen "Rennen1.txt" steht dies hier:

    Igor ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ{  RUS ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ....
    

    jedoch steht in der RenErg1.txt dies hier:
    [code]// .... schaut schon besser aus ^^/code]

    wie es ausschaut macht er bei void EingErgebnisse() irgendetwas falsch, weiss aber nich warum ;_;
    muss bis übermorgen fertig sein weiss einer rat?



  • @Gr33b0, habe mir den Code jetzt nicht komplett durchgelesen.
    Das Problem ist aber höchstwarscheinlich ein uninitialisierter bzw. nicht terminierter Puffer. Oder du schreibst mehr Daten in die Datei als der Puffer Groß ist.



  • Das ist das zu erwartende ergebnis bei der Art wie due die Datei anlegst.
    Da du die gesamte Struktur mit fwrite in die Datei schreibst ist das richtig so.
    wenn du tTemp und tSpeicher anlegst wir dauf dem Stack dafür der Speicher reserviert ohne das er mit einem bestimmten Muster gefüllt wird. Da du in der Windowsumgebung arbeitest und anscheinend Visaual C im Debug Mode kompilierst wird der Speicher mit 0xcc gefüllt.
    im Speicher werden bei dir 54 Bytes reserviert (vielleicht mehr wegen dem Alignment aber das tut hier nichts zur Sache) Wenn du jetzt den Namen einträgst wird sname vom Beginn an mit den Bytes gefüllt und ans Ende ein \0 geschreiben. Bei Igor sind das 4 Zeichen und das schließende \0 die nächten 25 Bytes bleiben ungeändert dann werden 4 Byts mit der Integer gefüllt bei dir ( und 3 nicht druckbare Zeichen dann komen 3 Zeichen RUS und \0

    struct TBiathleten
    {
        char sName[30];
        int sGJahr;
        char sNation[20];
    };
    

    Das gleiche passiert bei der Anderen Struktur, nur sind dort bis auf Name und NAtion alles integer somit nicht einfach lesbar.
    Wenn du die Daten lesbar in der Dateihaben willst solltest du sie mit fprintf in die Datei schreiben, das funktioniert wie das printf blos musst du zusätzlich den Filepointer nageben und an das Ende einer jeden Zeile ein \r\n schreiben

    Ich hoffe das hilft



  • jetz hab ich mal die datei hochgeladen
    hab dazu noch die anmelde.txt zum testen und die exe dazu reinkopiert
    http://mitglied.lycos.de/chipigoku/Programm/
    hoffe ihr könnt mir helfen oO

    edit: hab schon ca. die wurzel allen bösens gefunden ^^

    2 Gott No 0 0:0 0 Fehler 0 Gesamtpunkte
    2 Gott No 0 0:0 0 Fehler 0 Gesamtpunkte
    3 Hase D 1942 0:0 0 Fehler 0 Gesamtpunkte
    4 Lilith D 1981 0:0 0 Fehler 0 Gesamtpunkte
    5 Niko D 1850 0:0 0 Fehler 0 Gesamtpunkte
    6 Sascha D 1986 0:0 0 Fehler 0 Gesamtpunkte
    7 Sven D 1988 0:0 0 Fehler 0 Gesamtpunkte
    8 Basti D 1987 0:0 0 Fehler 0 Gesamtpunkte
    9 Hannibal RUS 1945 0:0 0 Fehler 0 Gesamtpunkte
    10 Commander D 1984 0:0 0 Fehler 0 Gesamtpunkte
    11 Peter D 1983 0:0 0 Fehler 0 Gesamtpunkte
    12 Mathias D 1987 0:0 0 Fehler 0 Gesamtpunkte
    13 Martin 1 D 1985 0:0 0 Fehler 0 Gesamtpunkte
    14 Bartholomäus D 1971 0:0 0 Fehler 0 Gesamtpunkte
    15 Samuel D 1980 0:0 0 Fehler 0 Gesamtpunkte

    das ist die bildschirmausgabe, die er macht, wenn man die ergebnisse eines rennens macht eingibt. ich hab die dateien geschlossen und hab sie in der gleichen funktion geöffnet. dann hab ich die einzelnen blöcke ruasgelesen und wiedergegeben. dass is halt dann das endergebnis.

    woran liegt das? ich zeig mal die funktion:

    void EingErgebnisse()
    {
    	int Auswahl,Wiederholung[15]={0},i=0,j=0,k=0;
    	char ZwSpeicher[15],ZwSpeicher2[15];
    	struct TBiathleten tSpeicher;
    	do{
    		system("cls");
    		printf("Fuer Welches Renen wollen Sie die Ergebnisse eintragen?\n(1-6 bzw. 7 fuer Ende)\n");
    		scanf("%d",&Auswahl);
    	}while(Auswahl<=0 || Auswahl>7);
    	if(Auswahl<7)
    	{
    		sprintf(ZwSpeicher,"Rennen%d.txt",Auswahl);
    		sprintf(ZwSpeicher2,"RenErg%d.txt",Auswahl);
    		dateizeiger=fopen(ZwSpeicher,"rb");
    		if(dateizeiger!=NULL)
    		{
    			dateizeiger2=fopen(ZwSpeicher2,"wb");
    			for(i=0;i<15;i++)
    			{
    				system("cls");
    				printf("=========================%s=========================\n\n",ZwSpeicher);
    				printf("Noch einzutragenen Biathleten: %d\n",15-i);
    				for(j=0;j<15;j++)
    				{
    					if(k==5)
    					{
    						printf("\n");
    						k=0;
    					}
    
    					if(Wiederholung[j]==1)
    					{
    						fseek(dateizeiger,(j)*sizeof(TBiathleten),SEEK_SET);
    						fread(&tSpeicher,sizeof(TBiathleten),1,dateizeiger);
    						printf("%d. %s  ",j+1, tSpeicher.sName);
    						k++;
    					}
    				}
    				do{
    					printf("\n\nBitte geben Sie die Startnummer ein: ");
    					scanf("%d",&tSpeicher.sStartnummer);
    				}
    				while(Wiederholung[(tSpeicher.sStartnummer)-1]!=0||(tSpeicher.sStartnummer>=16&&tSpeicher.sStartnummer<=0));
    				fseek(dateizeiger,((tSpeicher.sStartnummer)-1)*sizeof(TBiathleten),SEEK_SET);
    				fread(&tSpeicher,sizeof(TBiathleten),1,dateizeiger);
    				printf("\nDer Name des Laeufers lautet: %s\n\n",tSpeicher.sName);
    				printf("Bitte geben Sie die Laufzeit ein (MIN:SEC): ");
    				scanf("%d:%d",&tSpeicher.sMinuten,&tSpeicher.sSekunden);
    				printf("\nBitte geben Sie die Fehlversuche ein: ");
    				scanf("%d",&tSpeicher.sFehlversuche);
    				tSpeicher.sGesamtpunktzahl=((tSpeicher.sFehlversuche)*20)+((tSpeicher.sMinuten)*60)+tSpeicher.sSekunden;
    				printf("%d\n",tSpeicher.sGesamtpunktzahl);
    				Wiederholung[(tSpeicher.sStartnummer)-1]=1;
    				fwrite(&tSpeicher,sizeof(TBiathleten),1,dateizeiger2);		
    			}
    		}
    		else printf("Fehler! Es gibt noch keine Aufstellung für das %d.te Rennen!",Auswahl);		
    		fclose(dateizeiger);
    		fclose(dateizeiger2);
    		_getch();
    	}
    }
    

    wo is genau der haken jetzt?


Anmelden zum Antworten