Zugriffsfehler bei datenbank oder funktion?



  • Hallo werte C++ fachmänner und -frauen!

    Ich habe da ein Problem mit einem Programm, das ich schreiben muss.

    Es startet normal und meldet dann

    Unbehandelte Ausnahme bei 0x5f5b320f in STUDKAR3.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000061.

    Ich habe den verdacht, dass es an dem printf(...) in den jeweiligen aufgaben liegt. konnte es aber bislang nicht rausfinden...

    oder liegt der fehler in den funktionen? weil schreiben geht auch nicht in die datei....

    wäre cool, wenn da mal jmd mit einem geübten auge raufschaut. ich beschäftige mich damit erst seit ca 6 wochen ...

    danke im vorraus!

    #include "stdafx.h"
    #include "stdio.h"
    #include "stdlib.h"
    #include "malloc.h"
    
    typedef struct TStud{
    	char name;
    	char vorname;
    	char bday;
    	char stg;
    	int sem;
    	struct TStud *next;
    };
    
    struct TStud *lesen();
    struct TStud *schreiben();
    //TStud *akt;
    //TStud *start;
    
    //int _tmain(int argc, _TCHAR* argv[]){
    int main(){
    struct TStud *akt;
    struct TStud *start;
    int wahl;
    
    start=lesen();
    akt=start;
    
    printf("Was möchten Sie gerne tun?");
    printf("\n\n\n");
    printf("1: Ersten Eintrag einsehen\n");
    printf("2: Nächsten Eintrag einsehen\n");
    printf("3: Einen Studenten zur Datenbank hinzufügen\n");
    printf("4: Das Programm beenden\n");
    printf("\n\n\n");
    
    scanf("%i", &wahl);
    
    do{	
    if(wahl==1){
    	printf("%s %s %s %s %i", akt->name, akt->vorname, akt->bday, akt->stg, akt->sem);
    	}
    if(wahl==2){
    	akt=akt->next;
    	printf("%s %s %s %s %i", akt->name, akt->vorname, akt->bday, akt->stg, akt->sem);
    	}
    if(wahl==3){
    
    	schreiben();
    	}
    if(wahl==4){
    
    	system("CLS");
    	}
    }while(wahl>=1 && wahl<=3);
    
    	return 0;
    }
    
    struct TStud *lesen(){
    	struct TStud *start;
    	struct TStud *akt;
    	FILE *datei;
    	datei=fopen("studb.txt","r+");
    
    	if(datei!=NULL){
    
    		if(!feof(datei)){
    
    			start=(TStud*)malloc(sizeof(TStud));
    			start->next=NULL;
    			akt=start;
    			fscanf (datei,"%s %s %s %s %i",&akt->name,&akt->vorname,&akt->bday,&akt->stg,&akt->sem);
    			}
    		while(!feof(datei)){
    			if(!feof(datei)){
    				akt->next=(TStud*)malloc(sizeof(TStud));
    			    akt=akt->next;
    			fscanf (datei,"%s %s %s %s %i",&akt->name,&akt->vorname,&akt->bday,&akt->stg,&akt->sem);
    			}
    		}
    		akt->next=start;
    
    		fclose(datei);
    	}else printf("Es ist ein Fehler beim lesen/öffnen der Datei aufgetreten!");
    
    	return start;
    
    }
    
    struct TStud *schreiben(){
    
    	FILE *datei;
    	datei=fopen("studb.txt","a+");
    	struct TStud *data;
    	data=(TStud*)malloc(sizeof(TStud));
    	//data->next=NULL;
    
    	if(datei!=NULL){
    		printf("Bitte geben Sie nun die Daten des Studenten ein!");
    		printf("\n\n\n");
    		printf("Nachname:");
    		scanf("%s",&data->name);
    		printf("Vorname:");
    		scanf("%s",&data->vorname);
    		printf("Geburtstag:");
    		scanf("%s",&data->bday);
    		printf("Studiengang:");
    		scanf("%s",&data->stg);
    		printf("Semester:");
    		scanf("%i",&data->sem);
    
    	fprintf(datei,"%s %s %s %s %i\n",data->name,data->vorname,data->bday,data->stg,data->sem);
    	}
    	else printf("Fehler beim öffnen/schreiben der Datei!");
    
    	fclose(datei);
    	return 0;
    }
    


  • PS: es handelt sich hierbei um ein proggie, dass via einer einfach verketteten liste durchtabbt oder einen neuen datensatz anfügt...



  • Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC (Visual C++) in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo,

    fl3s schrieb:

    ich beschäftige mich damit erst seit ca 6 wochen ...

    bau das Programm neu auf. Schreib zuerst eine Testfunktion, die dir die Datei einliest und die Daten in der Konsole anzeigt. Wenn das zuverlässig klappt, kannst du die Funktion ausbauen und damit deine Liste erstellen.



  • Vielleicht noch ein paar Worte dazu, wie deine Strukturvariable aussehen sollten:
    Überall dort, wo du mehrere Zeichen einlesen willst, brauchst du einen Zeiger für den du Speicher reservieren musst oder ein Array konstanter Größe.

    #define STRING_MAXLEN 64
    typedef struct tstud TStud;
    
    struct tstud {
        char* pname;  
        char* pvorname;
    //..
    /*
    // oder: alternativ
    char name[STRING_MAXLEN];
    char vorname[STRING_MAXLEN];
    */
    // ...
        TStud *next;
    };
    


  • So in etwa täte ich mir eine ausbaufähige Testfunktion vorstellen getan:

    #include <stdio.h>
    #include <locale.h>
    
    #define SMAXLEN 64
    typedef struct tstud TStud;
    
    struct tstud {
        char name[SMAXLEN];
        char vorname[SMAXLEN];
    	int semester;
    	// ...
        TStud *next;
    };
    
    void view_struct ( TStud* pts, unsigned n ) {
    	unsigned i = 0;
    	while ( i < n ) {
    		printf("%s %s %d\n", pts[i].name, pts[i].vorname, pts[i].semester );
    		i++;
    	}
    }
    
    TStud test_struct;
    
    TStud* read ( char* fname ) {
    	unsigned lines = 0, elements = 3;
    	TStud* head = NULL, *curr = &test_struct;
    	FILE* fp = fopen ( fname, "rb" );
    	if ( fp == NULL ) {
    		printf ( "Kann %s nicht öffnen!\n", fname );
    		return NULL;
    	}
    	while ( !feof(fp)) {
    		if ( elements == fscanf( fp, "%s %s %d\n",
    			test_struct.name, test_struct.vorname, &test_struct.semester ))
    		{
    			view_struct ( &test_struct, 1 );
    			lines++;
    		}
    		else
    		{
    			puts ( "Empty line or not enough elements read." );
    		}
    	}
    	puts ("***********************************************");
    	printf ("%d lines were read successfully.\n", lines );
    	puts ("***********************************************");
    	fclose (fp);
    	return &test_struct; // Diese Testfunktion gibt noch nichts sinnvolles zurück.
    }
    
    int main() { 
    	char* fname = "test.txt";
    	char* language = "German";
    	setlocale ( LC_ALL, language ); // Wir wollen deutsche Umlaute anzeigen.
    	read ( fname );
        return 0; 
    }
    

    Die Testdatei test.txt hat hier den Aufbau

    peter lustig 66  
    hans kanns 8     
    brunhilde wurst 3
    

    Wobei jeder Datensatz mit einer Zeile abgeschlossen ist.

    Gruß,
    B.B.



  • vielen dank euch allen für die schnelle hilfe!

    ich gebe zu, ich hätte euch mehr infos geben müssen - auch zum thema debugging...

    Ich habe die nun fertig, ein wichtiger denkansatz ist "dsa von hinten nach vorne denken" 🙂

    ich werde mich nun daran machen das ganze noch ein wenig auszuschmücken 😉

    hier das ergebnis mit eurer hilfe:
    [cpp]
    #include "stdafx.h"
    #include "stdio.h"
    #include "stdlib.h"
    #include "malloc.h"

    typedef struct TStud{
    char name[30];
    char vorname[30];
    char bday[12];
    char stg[5];
    int sem;
    struct TStud *next;
    };

    struct TStud *lesen();
    struct TStud *schreiben();

    //int _tmain(int argc, _TCHAR* argv[]){

    int main(){
    struct TStud *akt;
    struct TStud *start;
    int wahl;

    start=lesen();

    printf("Was moechten Sie gerne tun?");
    printf("\n\n\n");
    printf("1: Ersten Eintrag einsehen\n");
    printf("2: Nächsten Eintrag einsehen\n");
    printf("3: Einen Studenten zur Datenbank hinzufuegen\n");
    printf("4: Das Programm beenden\n");
    printf("\n\n\n");

    do{
    scanf("%i", &wahl);

    if(wahl==1){
    akt=start;
    printf("%s %s %s %s %i", start->name, start->vorname, start->bday, start->stg, start->sem);
    }
    if(wahl==2){
    akt=akt->next;
    printf("%s %s %s %s %i", akt->name, akt->vorname, akt->bday, akt->stg, akt->sem);
    }
    if(wahl==3){
    schreiben();
    lesen();
    }
    if(wahl==4){
    system("CLS");
    return 0;
    }
    }while(wahl>0&&wahl<5);

    return 0;
    }

    struct TStud *lesen(){
    struct TStud *start;
    struct TStud *akt;
    FILE *datei;
    datei=fopen("studb.txt","a+");

    if(datei!=NULL){
    fseek(datei, 0L, SEEK_SET);
    if(!feof(datei)){
    start=(TStud*)malloc(sizeof(TStud));
    start->next=NULL;
    akt=start;
    fscanf (datei,"%s %s %s %s %i",&akt->name,&akt->vorname,&akt->bday,&akt->stg,&akt->sem);
    }

    while(!feof(datei)){

    if(!feof(datei)){
    akt->next=(TStud*)malloc(sizeof(TStud));
    akt=akt->next;
    fscanf (datei,"%s %s %s %s %i",&akt->name,&akt->vorname,&akt->bday,&akt->stg,&akt->sem);

    }
    }

    // akt->next=start;
    fclose(datei);
    }else printf("Es ist ein Fehler beim lesen/öffnen der Datei aufgetreten!");

    return start;

    }

    struct TStud *schreiben(){

    FILE *datei;
    datei=fopen("studb.txt","a+");
    struct TStud data;
    data=(TStud
    )malloc(sizeof(TStud));
    data->next=NULL;

    if(datei!=NULL){
    printf("Bitte geben Sie nun die Daten des Studenten ein!");
    printf("\n\n\n");
    printf("Nachname:");
    scanf("%s",&data->name);
    printf("Vorname:");
    scanf("%s",&data->vorname);
    printf("Geburtstag:");
    scanf("%s",&data->bday);
    printf("Studiengang:");
    scanf("%s",&data->stg);
    printf("Semester:");
    scanf("%i",&data->sem);

    fprintf(datei,"%s %s %s %s %i",data->name,data->vorname,data->bday,data->stg,data->sem);
    }
    else printf("Fehler beim öffnen/schreiben der Datei!");

    fclose(datei);
    return 0;
    }



  • ach mist hab vergessen die box zuzumachen -.- wenn ein mod das ggfs nachholen könnt wäre das lieb.

    aht einer ne idee, wie ich das noch so richtig hübsch machen kann? ich bastel gerade an netten abbruchbedingungen^^


Anmelden zum Antworten