עבור לתוכן

בעיית קבצים בC

Featured Replies

פורסם

שלום לכולם

יש לי איזשהו מבנה דינאמי ובתוכו גם שדות דינאמיים שאני שומר לקובץ בינארי, העניין המוזר הוא שאם אני שומר את הקובץ ואז מנסה לקרוא אותו אח"כ (למבנה אחר, בלי הקצאות דינאמיות וכאלה) אז הכל בסדר, אם אני סוגר את התוכנית ומנסה לקרוא אותו אז הוא לא קורא לי את השדות הדינאמיים, אני אצרף פה את המבנה ואת הפונקציות של השמירה והטעינה, אשמח אם מישהו יוכל לעלות על טעותי

המבנה


typedef struct
{
char company_name[LEN]; // company name
int years; // amount of years that he worked
char reasonToLeave[LEN]; //why have you left your old job
char city[LEN];


}OldCompany;


typedef struct
{
int id; // worker's id number
char worker_name[LEN]; // worker name
OldCompany *pCompany; // pointer to array of companies
int numCompanies; // number of companies in array
Bool frozen; // is the worker frozen
char city[LEN];
char street[LEN];
char tel[11];
char job[LEN]; //the worker profession
int experience; //how many years he is in the business
Stack recommendation; //people who can recommend

}Worker;

פונקציית השמירה:


void saveAllWorkersToBin(Worker *w, int size)
{
FILE * fp=fopen("All Workers.bin", "wb+");

if(fp== NULL)
{
puts("somthing went wrong...");
exit(1);
}

rewind(fp);
if(fwrite(w , sizeof(*w) , size , fp) != size)
{
printf("\nCan not write to file\n");
getch();
}
else
printf("all date saved to 'All Workers.bin' \n(press any key to continue)");

fclose(fp);
fflush(stdin);
getch();

}

פונקציית הטעינה:


int loadAllWorkers(Worker *w)
{
FILE *fp=fopen("All Workers.bin", "rb");
int i = 0;
Worker B[1];

B[0].pCompany = (OldCompany*) malloc (sizeof(OldCompany));
B[0].recommendation = CreateStack();
rewind(fp);

while(fread(&B[0] , sizeof(Worker) , 1 , fp) == 1)
i++;
if(ferror(fp))
{
printf("Can not READ the file\n");
getch();
return 0;
}

puts("load Successful \n(press any key to continue)");
return i;

}

כפי שאפשר לראות (כמובן מי שהגיע עד לפה וכבר על זה מגיע לו פרס) בפונקציית הטעינה הגדרתי סתם מבנה B, לא דינאמי ולא כלום, הוא בגודל 1 רק בגלל שניסיתי לעשות שם כל מיני משחקים כדי שזה יפעל, כמו כן בגלל זה יש שם הקצאה דינאמית למערך של oldCompany ולאיזו מחסנית - אלו השדות הבעייתים שלא נטענים, חשבתי שאולי זה יפתור את הבעיה, ברור שבתכלס צריך לעשות את המניפולציות האלה עם המבנה W. שוב אני מזכיר שאם אני מכניס נתונים למבנה הזה (W) ושומר אותם ואז באותה הרצה מנסה גם לטעון אותם מחדש לB אז הכל נטען כמו שצריך, הבעיה היא שבתחילת תוכנית זה לא טוען הכל... טוב אני מקווה שהכל מובן ואם לא אז תגידו לי מה ואני אשתדל להבהיר את העניין

בתודה מראש (וסליחה על החפירה :P )

פורסם

נתחיל מזה שאין צורך לפתוח את הקובץ לכתיבה באמצעות +wb (הפלוס אומר שזה גם לקריאה וגם לכתיבה, אבל אתה לא קורא מהקובץ) וגם ה-rewind מיותר.

חוץ מזה, יש לך בעיה עקרונית בשמירה של המבנה - בין השאר, אתה שומר את pCompany שהוא המצביע למערך החברות שאליו מקושר העובד. אבל המערך הזה הוא דבר ארעי, וברגע שאתה סוגר את התכנית המצביע הזה חסר משמעות. הדבר הנכון הוא לשמור את המערך בנפרד, ולא תוכל להשתמש כאן ב-fwrite פשוט, אלא תצטרך לכתוב פונקציית שמירה מורכבת יותר. אגב, אם המבנה Stack מכיל מצביעים אז תהיה שם אותה בעיה בדיוק.

חוץ מזה, הביטוי

&B[0]

הוא שקול לחלוטין ל-B, ולא ברור לי בכלל למה אתה יוצר מערך בגודל 1 (זה חסר משמעות, באותה מידה אתה יכול פשוט להגדיר משתנה מטיפוס Worker, ואז להעביר מצביעים אליו כשצריך).

פורסם
  • מחבר

תודה רבה

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

ארכיון

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

דיונים חדשים