unterschiede win/lin bei fopen/fread
-
ich hab ne ladefunktion die unter windows schon lange benutzt wird und funktioniert
unter linux springt er nach fread raus weil die erhaltenen daten nich das sind was er erwartetgibts irgendwelche leichten unterschiede zwischen den funktionen
so wie win->sleep(ms) lin->sleep(s)
-
solange du dich an den ISO C Standard hälst, sollte es keine Probleme geben.
Wenn du konkrete Hilfe willst, zeig einfach mal ein bissel Code.
-
void* Handle; long ReadFile(const char* ucpFileName) { FILE *fp; BITMAPFILEHEADER bmfHdr; //hab die struct umbenannt und aus dem gdi header kopiert long lImageSize; long lDAROffset; fp =fopen(ucpFileName,"rb"); if (fp == NULL) return(BLAH_ERROR); fread((void*)&bmfHdr,sizeof(BITMAPFILEHEADER),1,fp); lDAROffset = bmfHdr.bfOffBits- sizeof(BITMAPFILEHEADER); lImageSize = bmfHdr.bfSize - sizeof(BITMAPFILEHEADER); Handle = malloc(lImageSize);//lImageSize is negativ if (!Handle) { //hier springt er raus ... ...
-
Das kommt davon, wenn man Strukturen Binär abspeichert. Der GCC nutzt wahrscheinlich ein anderen Padding als der Compiler, den du unter Windows nutzt. Deswegen kommt es wahrscheinlich zu dem Konflikt. Wenn du die Daten unter Linux neu generierst, sollte es aber keine Probleme geben, solange du nicht auf die Idee kommst irgend etwas an der Optimierung zu ändern. Am besten verzichtest du komplett darauf Datenstrukturen Binär zu exportieren.
-
fopen() und fread() werden auf beiden Systemen gleich funktionieren, außer du öffnest die Datei mit "rt", was unter Windows zum Umwandeln CRLF -> LF führt. Das Problem wird sein, dass du den Inhalt der Datei in eine Struktur schreibst. Die Größe der in der Struktur enthaltenen Variablen (z.B. "int") ist u. U. bei Linux anders als bei Windows. Vergleiche mal den Wert von
sizeof(BITMAPFILEHEADER)
auf beiden Systemen.
Eventuell ist auch die Reihenfolge der Bytes ("little" oder "big endian encoding") andersherum.Martin
-
das struct member alignment is bei vc++ auf 8 bytes... wie lautet das flags, um es beim gcc auf den gleichen wert zu setzen?
ums exportieren der daten gehts mir vorerst garnich... ich will nur die ladefunktion für bitmaps zum laufen bringen
das würde reichen um der logic was zu futtern zu geben
-
Bitmap-Header müssten IMHO gepackt sein (dh ohne, dass der Compiler Padding einfügt). Du kannst beim gcc die Deklaration so ändern:
struct Bitmapheader { blah blah } __attribute__((packed));
Ich hab sowas mal für nen WAV-Header geschrieben.