שאלה ב-C....

akakor

New member
שאלה ב-C....

יש לי בעיה עם פונקציות fread ו-fwrite. תעיינו בבקשה בפונקציה ותגידו לי מה הבעיה? FILE *p1,*p2; int iTemp, i, flag, size = 0; Word *pList1 = Head->next; void *ptr_to_buf; p2 = fopen("Target.txt","w"); p1 = fopen("Source.txt","r"); if ( p1 == NULL || p2 == NULL) { puts("\nERROR in OPENing file AfterNewLine or target .txt"); exit(0); } //adding fputs("Printing every 10th word from list\n", p2); rewind(p1); do{ iTemp=0; for(i = 0; i<9; i++) { if(pList1->next == NULL) { flag = 1; break; } iTemp = iTemp + sizeof(*pList1); pList1 = pList1->next; }//end for //read and write size = sizeof(*pList1); fseek(p1,iTemp,SEEK_CUR); fread(ptr_to_buf, size,1 ,p1); fseek(p2,0,SEEK_END); fwrite(ptr_to_buf, size,1 ,p2); pList1 = pList1->next; }while((pList1->next!=NULL) || flag != 1); תודה
 

akakor

New member
זה יצא קצת לא מובן...

הבעיה שלי בשורות: fseek(p1,iTemp,SEEK_CUR); fread(ptr_to_buf, size,1 ,p1); fseek(p2,0,SEEK_END); fwrite(ptr_to_buf, size,1 ,p2);
 

gamy

New member
בקשר לptr_to_buf

אוקיי יש פה קריאה לתוך ptr_to_buf. אבל לאן הוא בדיוק מצביע? הוא רק מוכרז פעם אחת: void *ptr_to_buf; אין הקצאה דינמית של מקום, הוא לא מצביע לשום מקום (הוא אפילו לא מאותחל לNULL)
 

akakor

New member
איתחלתי אותו....

כתבתי void *ptr_to_buf = 0; וזה עדיין לא רץ... אני מנסה עכשיו לעשות זאת עם הקצאה דינמית... הבעיה היא שאני צריך כל פעם להקצות גודל שונה...
 

gamy

New member
ברור שזה לא רץ

ptr_to_buf מאותחל לNULL, ואת מנסה לקרוא אליו מידע! בטח התוכנית נתקעה לך או שקיבלת acess violation או משהו כזה. פשוט תקצי דינמית, או שתשתמשי במערך בגודל קבוע (מה שיותר מתאים).
 

akakor

New member
עשיתי דבר כזה:

do{ iTemp=0; for(i = 0; i<9; i++) { if(pList1->next == NULL) { flag = 1; break; } iTemp = iTemp + sizeof(*pList1); pList1 = pList1->next; }//end for //read and write size = sizeof(*pList1); ptr_to_buf = malloc(size); fseek(p1,iTemp,SEEK_CUR); fread(ptr_to_buf, size,1 ,p1); fseek(p2,0,SEEK_END); fwrite(ptr_to_buf, size,1 ,p2); free(ptr_to_buf); pList1 = pList1->next; }while((pList1->next!=NULL) || flag != 1); עדיין יש שגיאה בזמן ריצה... אני לא יכול לבדוק את זה עם DEBUG כי הלולאה DO_WHILE רצה מאות פעמים... אני יודע שבפעם הראשונה הוא עושה את הלולאה ללא בעיות...
 

yair24

Member
תנסה את זה:

רק לצרכי DEBUG תנסה להגדיר את PTR TO BUF כמערך של CHARS בגודל 100 תשאיר את הקריאה לפונקציה FREAD כמו שהיא ותראה מה קורה. אתה חייב לאתחל איכשהו את הפוינטר הזה אי אפשר לבצע השמה לפוינטר לא מאותחל וההשוואה שלו ל-0 היא לא איתחול. צריך להקצות לו זיכרון אם בצורה דינאמית או לא דינאמית - זאת כבר החלטה שלך. יאיר
 

yair24

Member
בבקשה ../images/Emo13.gif

אבל חשוב להבין שכדי שהתוכנית תהיה כתובה בצורה נכונה אתה חייב להשתמש בהקצאה דינאמית (MALLOC וגם ייתכן REALOC) כי מה יקרה אם מחר למשל תרצה לקרוא מחרוזת שהיא מעל 100 תוים? תהיה לך גלישת זיכרון!! לעומת זאת אם אתה עושה הקצאה דינאמית לא תהיה לך גלישת זיכרון. יאיר
 
למעלה