Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

17.12.2003, 22:07

Problem mit fread /fwrite

Hey hab ein kleines problem das ich total verwirrend finde und auch keine ahnung habem, wo sich der fehler eingeschlichen haben könnte...

ich habe eine struktur....

Quellcode

1
2
3
4
5
struct SLevel
{
    sbVertex    vertices[36];
    int         indices[144];
};


die fülle ich mit daten und speicher die struktur dann mit fwrite...

Quellcode

1
2
3
FILE* tmpFile = fopen("..//levels//testmap.lvl","wc");
    fwrite(&level,sizeof(SLevel),1,tmpFile);
    fclose(tmpFile);


allerdings klappt das nicht so ganz... denn wenn ich kontrolliere ob die werte korrekt gespeichert wurden...

Quellcode

1
2
3
4
5
6
7
8
tmpFile = fopen("..//levels//testmap.lvl","r");
    fread(&test,sizeof(SLevel),1,tmpFile);
    fclose(tmpFile);

    for(int t = 96; t < 100; t++)
    {
        printf("Index[%i] = %i \n",t, test.indices[t]);
    }


kommt ab index 97 nur noch falsche werte -40000 oda so raus... woran kann denn das liegen?.. ich hab zur kontrolle ob die werte richtig berechnet werden auch ne debug.txt wo alles korrekt drinsteht... die werte werden also eigentlich korrekt berechnet aber irgendwie net richtig gespeichert oder gelesen ???

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

17.12.2003, 23:05

Probier mal "wb" für Schreiben und "rb" für Lesen (bei fopen).

3

18.12.2003, 12:46

zur sicherheit
schreib mal
#pragma pack(1)
vor und
#pragma pack()
hinter die definition deines structs.
alternativ, rufe fread für jedes feld deiner struct explizit auf

Quellcode

1
fread(&test.diffuse, 4, 1, stream);


so ein ähnliches problem hatte ich auch. aber es könnte auch an "wc" liegen.
was soll das c eigentlich bewirken.?

4

18.12.2003, 13:46

Ich hatte genau das gleiche Problem auch einmal, und zwar mit dem Typ float. Als ich dann den float im Konstruktor mit dem wert 0 vorab initialisiert hatte, ging alles prima.
Ausserdem sollte man im Debugger vom Visual Studio.net 7.0 immer den Haltepunkt in die nächste Zeile nach der zu prüfenden Variable legen, sonst bekommt man immer nur den letzten oder einen falschen Wert zu sehen. Auf diese Weise hat sich bei mir auch schon der ein oder andere undurchsichtige Wert eingeschlichen.

5

18.12.2003, 13:55

ich denk halt das problem liegt in der 32bit-optimierung.
wahrscheinlich landen beim fread-aufruf deshalb einige daten
in den dummy-variablen seines structs.

6

18.12.2003, 16:03

Danke für die hinweise!! ich hab mal alle tipps angewandt und siehe da es klappt.. nur eine frage.. was bedeutet

Quellcode

1
2
#pragma pack(1)
#pragma pack()


eigentlich? aber ist ja schon mal super dass es jetzt klappt :wirbel:

7

18.12.2003, 17:23

naja, der compiler versucht den code so zu bauen, dass er auf einem 32bit system
möglichst schnell läuft. da ein 32bit-prozessor am liebsten auch mit 32bit-variablen arbeitet, hat das irgendwie (genaueres weis ich auch nicht)zur folge,
das bei structs & co. dummies eingebaut werden, falls das struct nicht sauber durch 4(4 byte = 32bit) teilbar ist.
mit der #pragma-direktive pack kann man dem compiler sagen auf welche
byte-größe er optimieren soll. pack(1) = 1 byte.
dann hast du keine dummies zwischen deinen eigentlichen variablen.
denn wenn du die hast, und dann fread oder memcpy oder ähnliches
benutzt kanns halt sein das teile in den dummies und nicht da landen wo du sie haben willst.
aber mehr weis ich auch. das hab ich gelesen, eben als ich selbst das gleiche problem
hatte und mirs nich erklären konnte.
natürlich ohne gewähr vielleicht laber ich auch scheiße

pack() setzt wieder den normalzustand.

rip 23

8

18.12.2003, 17:24

ps: du kannst ganz einfach prüfen ob dein struct betroffen ist oder nicht.

ruf doch mal sizeof(struct xyz) auf und dann rechne mal per hand aus
wie groß es seien müsste. wenn ne differenz da ist, dann sollte das daran liegen(siehe oben)

9

18.12.2003, 18:04

ahja danke klingt ganz logisch :) werd ich mal machen! und thx nochmal für die hilfe

10

15.04.2011, 18:25

Habe ein ähnliches Problem.

Ich erstellen von folgender Struktur ein Feld mit "ANZ" Elementen

C-/C++-Quelltext

1
2
3
4
typedef struct Dungeons 
{ String Dungeon_Info[20]; 
int Number; 
}Dungeons;


C-/C++-Quelltext

1
Dungeons Dungeon_List[ANZ];


nun möchte ich das Feld abspeichern

C-/C++-Quelltext

1
2
3
 written_elements = fwrite(Dungeon_List, sizeof(Dungeons), i, file); 
if(written_elements == i) 
{...


wobei i die Anzahl der im Feld befindlichen Strukturen angibt.

danach möchte ich das später wieder einlesen

C-/C++-Quelltext

1
read_elements = fread(Dungeon_List, sizeof(Dungeons), ANZ , file);




Das Problem ist jetzt folgendes:

Wenn ich das Programm beende und später wieder neustarte, liest mir fread nichts ein - in meinem Feld steht nach wie vor nichts drinnen.

#pragma pack() liefert keine Verbesserung (sizeof(Dungeons) ist 84, sizeof(int) = 4 und sizeof(String) = 4 - bei 20 Strings und einem int stimme die Rechnung)

Übersehe ich da irgendetwas?

Werbeanzeige