Forum: Compiler & IDEs fwrite Probleme


von Helios (Gast)


Lesenswert?

Habe da ein Standardausleseprogramm:
1
 struct liste{
2
    char Name[NAME_MAX];
3
    long Anzahl;
4
    char Artikelnummer[ARTIKEL_MAX];
5
};
6
7
typedef struct liste EINLAUFSLISTE
8
9
int main(){
10
  
11
  EINKAUFSLISTE meineLste[10];
12
  
13
  if(eingabe == AUSGEBEN)
14
          show(&meineListe[0]); //Zeige gesamte Liste an
15
        else if(eingabe == HINZUFUEGEN)
16
             putItem(&meineListe[0]);
17
     else if(eingabe == 8)
18
             save(&meineListe[0]);//speichern
19
        else if(eingabe == 9)
20
             read(&meineListe[0]);//lese
21
}
22
23
24
void save(EINKAUFSLISTE *liste){
25
    FILE *datei;
26
    if( (datei = fopen("einkaufsliste.bin", "w")) == NULL)
27
       printf("Fehler beim oeffnen der Datei");
28
    else{
29
        //Schreibe
30
        fwrite(liste, sizeof(EINKAUFSLISTE), 10, datei);
31
        fclose(datei);
32
        printf("\nsaved!\n");
33
    }
34
}
35
36
void read(EINKAUFSLISTE *liste){
37
    FILE *datei;
38
    if((datei = fopen("einkaufsliste.bin", "r")) == NULL)
39
        printf("Fehler beim oeffnen der Datei");
40
    else{
41
        //Lese
42
        fread(liste, sizeof(EINKAUFSLISTE), 10, datei);
43
        fclose(datei);
44
        printf("\nread!\n");
45
        printList(liste);
46
    }
47
}

fwrite schreibt richtige Werte in das File, jedoch fread ließt nur das 
erste Element aus. Was simmt nicht?

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Gezielt eingestreute "&" (zB VOR "liste" => "&liste" sollten
helfen. fread/fwrite erwarten Zeiger auf die Struktur.

Nebenbei geben diese Funktionen auch etwas zurück was man
testen könnte ;)

von Helios (Gast)


Lesenswert?

Joachim Drechsel schrieb:
> Gezielt eingestreute "&" (zB VOR "liste" => "&liste" sollten
> helfen. fread/fwrite erwarten Zeiger auf die Struktur.

liste ist doch schon ein Zeiger. Schreibe ich ein & davor, dann stürzt 
es ab.

Joachim Drechsel schrieb:
> Nebenbei geben diese Funktionen auch etwas zurück was man
> testen könnte ;)

Danke. Ich habe immer einen Fehler bei fread und der Rückgabewert ist 
immer 0.

von Helios (Gast)


Lesenswert?

Also bei fwrite ist der Rückgabewert immer 10 und alles passt, auch die 
Datei passt, nur bei fread ist der Rückgabewert immer 0. Ich weiß aber 
nicbt wieso?

von DirkB (Gast)


Lesenswert?

Dann frag doch mal die Funktion ferror ob es einen Fehler gegeben hat 
oder nimm gleich perror.

von Peter II (Gast)


Lesenswert?

steht denn in der Datei alles drin? Linux oder Windows? Wenn Windows 
dann öffne die Datei mal im binary mode.

von Helios (Gast)


Lesenswert?

Peter II schrieb:
> dann öffne die Datei mal im binary mode.

das geht schon eher. Also Rückgabewert ist immer 10. Nur die Wörter 
werden immerleicht abgeändert. Oder Zahlen sind aufeinmal um eins höher 
oder ganz was anderes.

von Martin B. (Gast)


Lesenswert?

hast Du auch daran gedacht, beim Öffnen zum Schreiben "wb" statt "w" 
anzugeben?

von Helios (Gast)


Lesenswert?

Martin B. schrieb:
> hast Du auch daran gedacht, beim Öffnen zum Schreiben "wb" statt "w"
> anzugeben?

Mein Retter in der Not. Jetzt funktioniert es endlich. Unter linux 
müsste ich dann diese b's weglassen oder?
Also sprich:

fopen("neu.bin", "w oder r");

von Peter II (Gast)


Lesenswert?

kann es auch bei Linux stehen lassen, dürfte nicht stören.

von Rolf Magnus (Gast)


Lesenswert?

Helios schrieb:
> Martin B. schrieb:
>> hast Du auch daran gedacht, beim Öffnen zum Schreiben "wb" statt "w"
>> anzugeben?
>
> Mein Retter in der Not. Jetzt funktioniert es endlich. Unter linux
> müsste ich dann diese b's weglassen oder?

Nein. Warum denkst du, daß du das müßtest? Es ist ein binary-File, also 
gehört da ein b hin. Es ist nur so, daß es unter Linux egal ist, weil es 
dort im Gegensatz zu Windows keinen Unterschied zwischen binary- und 
Text-Modus gibt.
Also: Mit b geht's überall, ohne gehts unter Windows nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.