Kleines Problem



  • Moin...

    Ich arbeite gerade an einer Software für einfacheres Lernen. Dabei wird mit
    Multiplechoice gearbeitet. Sprich Quize welche man auswählen und ausführen kann.
    Dabei kann man halt ein neues Quiz hinzufügen. Mein Problem liegt bei der
    AddQuiz(); funktion, da wird mir nämlich angegeben, dass eine gewisse Datei
    nicht vorhanden ist, obwohl sie in wirklichkeit vorhanden ist.

    Hier die Funktion:

    void AddQuiz(){
    
    	char pfad[100];
    	char kpfad[100];
    
    	int x,y;
    	FILE* dat;
    
    	gotoxy(12,5);
    	printf("Geben Sie den Namen des Quizes an: ");
    	x=wherex();
    	y=wherey();
    	gotoxy(12,9);
    	textcolor(GREEN);
    	printf("Beispiel: MusterQuiz.ini");
    	textcolor(WHITE);
    
    	ReadPfad(pfad, x, y);
    	strcpy(kpfad, "data/");
    	addchar(kpfad,pfad);
    
             dat=fopen(kpfad,"r"); // fürt zu dat == NULL
    
    	//dat=fopen("data/Quiz.txt", "r"); //würde funktionieren
    
    	if(dat == NULL){
    		gotoxy(10,15);
    		textcolor(RED);
    		printf("Datei nicht vorhanden!\n");
    		//system("tree");
    		textcolor(WHITE);
    	}
    	else{
    		fclose(dat);
    		FLUX.AnzQuizes++;
    		strcpy(FLUX.QuizNames[FLUX.AnzQuizes-1], (const char *)pfad);
    		WritePrivateProfileString("Quiz",FLUX.QuizKeys[FLUX.AnzQuizes-1], FLUX.QuizNames[FLUX.AnzQuizes-1], "data/flux.ini");
    	}
    
    	/*
    	gotoxy(12,12);
    	printf("%s", kpfad);
    	*/
    	getch();
    
    	FlippFlux();
    
    }
    

    beim debuggen stellte ich keine fehler im String fest, denn der Inhalt von

    kpfad ist identisch zu "data/Quiz.txt"

    Ich verzweifle noch -.-

    greeze
    ITEDVO



  • Gib doch mal kpfad aus bevor du fopen aufrufst.

    Mfg Mo3bius



  • ist weiter unten doch auskommentiert, sprich hab ich bereits gemacht. die
    Ausgabe erfolgt korrekt, sprich:

    data/Quiz.txt

    was ja das merkwürdige ist...

    kleines detail: ProjectSettings --> Multibyte Zeichensatz

    könnte an dem liegen, hab ich jedoch eingestellt weil er bei der Funktion
    WritePrivateProfileString(...) gemeckert hat...



  • Was steht nach Zeile 22 in errno?



  • Kann es sein, dass

    pfad[strlen(pfad)-11]=='\n'
    

    ?
    Also in dem Fall einfach schreiben

    pfad[strlen(pfad)-11]=0;
    

    Zum Lesen einer existentierenden Datei sollte man eigentlich immer berechtigt sein.



  • Versuch doch mal das Problem einzugrenzen. Setze mal kpfad auf "data/Quiz.txt" und probier mal ob fopen dann funktioniert.



  • nun ja, hier mal die funktion addchar()...

    void addchar(char dest[], char add[]){
    
    	int idx;
    	int leng_add=0;
    	int i=0;
    
    	for(idx=0; dest[idx+1]!='\0'; idx++);
    	for(leng_add=0; add[leng_add]!='\0'; leng_add++);
    
    	idx++;
    
    	for(i=0; i<leng_add; i++, idx++){
    		dest[idx]=add[i];
    	}
    
    	dest[idx]='\0';
    
    }
    

    erhöhre ich idx vor

    dest[idx]='\0';

    so steht in kpfad ein zeichen zu viel drinnen, sprich das '\0' wurde richtig
    gesetzt. bei der ausgabe erfolgt ebenfalls die korrekte ausgabe.

    greeze
    ITEDVO



  • itedvo schrieb:

    nun ja, hier mal die funktion addchar()...

    Macht die was anderes als strcat? Falls nicht, schafft man sich so nur Fehlerquellen.



  • in errno steht 22 drinnen, ich scha grad mal was das heißt =b



  • mit strcat() ergibt sich der gleiche fehler... von dem her hab ichs eh richtig
    ausprogrammiert...



  • In pfad steht wahrscheinlich wie schon vermutet ein abschließendes '\n', welches man entfernen sollte.

    ReadPfad(pfad, x, y);
    if( strchr(pfad,'\n') ) *strchr(pfad,'\n')=0;
    


  • Das ist auch nur ein grundsätzlicher Hinweis. Es gibt keinen Grund, eine bereits vorhandene Funktionalität neu zu schreiben, richtiger kann man es nicht machen, falscher aber schon.
    Wenn:

    itedvo schrieb:

    //dat=fopen("data/Quiz.txt", "r"); //würde funktionieren
    

    Dann kann:

    itedvo schrieb:

    kpfad ist identisch zu "data/Quiz.txt"

    doch ganz offensichtlich nicht stimmen.
    Probier doch mal:

    strcpy(kpfad, "data/Quiz.txt");
        dat=fopen(kpfad,"r");
    


  • Bei deiner Kontrollausgabe kannst du schlecht erkennen, ob irgendwelche nichtdruckbare Zeichen enthalten sind. Besser ist, du klammerst den Text.

    printf("<%s>", kpfad);    // <data/Quiz.txt>
    // oder
        printf("\"%s\"", kpfad);  // "data/Quiz.txt"
    


  • µngbd schrieb:

    Was steht nach Zeile 22 in errno?

    Bei mir ist das EINVAL. Vielleicht ist das bei dir auch so.



  • die lösung von wutz hat funktioniert bzw. ich hab ja zeichenweise eingelesen
    und das '\0' erst nach dem Enter gemacht. ich habs jetzt so gelöst:

    pfad[i-1]='\0';
    

    danke, so ein kleiner Fehler und solch eine Zeit einbusung, gibts ja nich...
    aber ihr wart wieder mal super =b


Anmelden zum Antworten