עבור לתוכן

קריאה של קובץ בינארי לתוך STRUCT מורכב.

Featured Replies

פורסם

מה הדרך לעשות את זה? (הSTRUCT מכיל שדות בגדלים שונים).

הקובץ הבינארי מכיל את המידע של הSTRUCT איך שהוא נראה בזכרון. (MEMORY DUMP).

תודה!

פורסם

אותו דבר רק הפוך ? תקצה קטע זיכרון בגודל המבנה, ותקרא לתוכו את תוכן הקובץ.

פורסם
  • מחבר

יש לך דוגמא , לא הבנתי.

פורסם

struct a_struct a;

fread (&a, sizeof(struct a_struct), 1, file);

פורסם
  • מחבר

תודה!

וזה יעבוד אפילו אם בתוך הSTRUCT הזה יש עוד תתי STRUCT-ים, שמכילים בתוכם משתנים בגדלים שונים? (32\8 ביט)?

פורסם

כן, כל עוד כמובן ה struct לא מכיל פוינטרים (ושהוא נכתב לקובץ בצורה דומה).

פורסם

זה לא מדויק.

C מסדר את הנתונים ב-struct כך שיהיה להם alignment מתאים לקריאה מהירה. לדוגמא struct שמכיל char ואחריו int בד"כ יתפוס 8 בתים (על x86), תלוי בקומפיילר ובאופציות הקומפילציה. בין ה-char ל-int יהיו 3 בתים עם תוכן לא מוגדר. זה נקרא padding. יש חוקים קצת מורכבים למתי ואיך זה נעשה.

אפשרות אחת היא לקרוא מהקובץ את הנתונים אחד אחד. אפשרות שניה היא לכתוב את הקובץ באותה צורה, כך שגם ה-padding נכתוב (לא מומלץ!).

אפשרות שלישית היא מה שנקרא packing - להכריח את הקומפיילר "לדחוס" את הנתונים ב-struct לגודל המינימלי. כל קומפיילר עושה את זה אחרת, וזה לא פורטבילי. חפש "struct packing".

פורסם

זה מאוד מדוייק, לכן ציינתי (ושהוא נכתב לקובץ בצורה דומה), שזה שיטה אחרת להתכוון לכל מה שאמרת בלי לפרט :)

פורסם
  • מחבר

זה לא מדויק.

C מסדר את הנתונים ב-struct כך שיהיה להם alignment מתאים לקריאה מהירה. לדוגמא struct שמכיל char ואחריו int בד"כ יתפוס 8 בתים (על x86), תלוי בקומפיילר ובאופציות הקומפילציה. בין ה-char ל-int יהיו 3 בתים עם תוכן לא מוגדר. זה נקרא padding. יש חוקים קצת מורכבים למתי ואיך זה נעשה.

אפשרות אחת היא לקרוא מהקובץ את הנתונים אחד אחד. אפשרות שניה היא לכתוב את הקובץ באותה צורה, כך שגם ה-padding נכתוב (לא מומלץ!).

אפשרות שלישית היא מה שנקרא packing - להכריח את הקומפיילר "לדחוס" את הנתונים ב-struct לגודל המינימלי. כל קומפיילר עושה את זה אחרת, וזה לא פורטבילי. חפש "struct packing".

הקובץ כתוב ביחד עם הPADDING(בוודאות), האם השיטה שyousux הציע תעבוד כעת?

פורסם

בהנחה שזה אותו קוד על אותו סוג מכונה שקומפל עם אותו קומפיילר עם אותם אופציות - כן.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים