2016-06-05 14 views
-1

Ich habe Probleme beim Speichern und Laden von Daten aus der TXT-Datei in das dynamische Array.Laden der Struktur aus der TXT-Datei in das dynamische Array

Mein ganzes Programm basiert auf switch statement. Ich werde nur hier einfügen, die für die Zuweisung von Speicher für Array und Aufruf von Funktion verantwortlich ist, um es mit Struktur zu füllen. Und Funktionen zum Speichern und Laden von Daten.

Code wie folgt aussieht

case 1: 

      system("cls"); 

      printf("Enter amount of students you want to put in data base\n"); 
      scanf("%d",&number_of_students); 

      student=(data*)malloc(number_of_students*sizeof(data)); 
      adding_students_to_base(number_of_students); // its a simple functions based on for loop. I don't think that posting it here is necessary 
    break; 

und Funktionen: (. Funktion saving_base_to_file nimmt number_of_students als Eingabeargument)

void saving_base_to_file(int amount_of_students) 
{ 
    FILE *file; 


    system("cls"); 
    printf("Saving base to file!\n"); 

    file=fopen("database.txt","wb"); 
    fprintf(file,"%d",amount_of_students); // function also saves amount of students in base 
    fwrite(student,sizeof(data),amount_of_students,file); 
    fclose(file); 

    _getch(); 
    system("cls"); 
} 




void loading_base_from_file() 
{ 
    FILE *file; 

    system("cls"); 
    printf("Reading base from file\n"); 

    file=fopen("database.txt","rb"); 

    if (file!= NULL) { 
     fscanf(file,"%d",&number_of_students); 
     fread(&student,sizeof(data),number_of_students,file); //number_of_students is global variable 
     student=(data*)malloc(number_of_students*sizeof(data)); 
     fclose(file); 
    } 
    else 
    { 
     printf("File does not exist!.\r\n"); 
     printf("File have to be named ""database.txt"" !!!\n"); 
    } 
    _getch(); 
    system("cls"); 
} 

Problem erscheint, wenn ich möchte, dass meine "loading_base_from_file" verwenden, Funktion

Zum Beispiel, wenn ich wan t um einen Schüler mit student_id "123456" namens "Greg" "Tesla" zu speichern, enthält die Datei dies: database.txt. Die Funktion saving_base_to_file speichert auch die Anzahl der Schüler in der Basis. Aber wenn ich wieder mein Programm starten (oder tut es in einem Programmlauf) und versuchen Sie laden Daten aus der Datei zu tun, meine Funktion „print_base“ druckt diese: result

Ich denke, dass es ein Problem mit „Putting“ -Daten in Array, aber ich weiß nicht, was genau falsch ist. Können Sie mir sagen, warum das passiert und wie es zu beheben?

+0

Die Verwendung von 'fscanf/fprintf' und' fread/fwrite' auf demselben Datei-Handle ist schwierig, keine schlechte Idee zu sagen. – alk

+0

Wirf nicht das Ergebnis von 'malloc' & friends in C! – Olaf

Antwort

0

Ihre Verwendung von student zeigt an, dass es sich um einen Zeiger handelt. Das heißt, wenn Sie den address-of-Operator & für die Variable verwenden, erhalten Sie den Zeiger auf den Speicherort der Variablen, nicht einen Zeiger auf den Speicher, den Sie zuweisen. Der Typ &student ist data ** nicht data *.

Das allein führt zu undefined Verhalten wie Sie über Daten irgendwo im Speicher schreiben, wo es nicht sein sollte, aber ist nicht das einzige Problem. Das andere Problem ist, dass Sie Speicher für studentnach reservieren, lesen Sie die Daten aus der Datei, machen student Punkt woanders vollständig und auch Sie verlieren die Daten, die Sie gerade lesen.

Erste Speicher zuordnen, dann lesen in student (und nicht &student).


Es gibt noch ein anderes Problem, und das ist, mischen Sie Textdaten und Binärdaten. Die ursprüngliche Zahl, die Sie als die Anzahl der Datensätze in der Datei gelesen haben, ist beim Lesen nicht korrekt, wenn das erste Element in der Struktur einen Wert enthält, der als Textstelle analysiert werden kann.

Sie müssen fwrite die Nummer, und fread es zurück.

+0

Danke, Fall geschlossen! – Eredin