הפונקציה fopen

tseliot

New member
הפונקציה fopen

מה זה אומר אם היא החזירה לי מצביע, שמצד אחד הוא לא NULL, כלומר לא התרחשה שגיאה והקובץ קיים, אבל מצד שני הערך שלו מסומן כ <BAD PTR> על ידי הקומפיילר, והתוכנה קורסת כשמנסים להשתמש בו?
 

vinney

Well-known member
נשמע מוזר

איך הקומפיילר מסמן BAD PTR? איזה קומפיילר זה?
 

tseliot

New member
visual studio

אם אני מוסיף WATCH לפוינטר, אז מסומנת הכתובת שלו ואחריה 00X0000 או משהו כזה, וכתוב <BAD PTR>. הקטע הכי מחרפן, זה שלפני זה הקוד עבד לי בפרויקט אחר... אז חשבתי אולי בטעות עשיתי שינוי בקוד, אז ממש לקחתי והעתקתי אותו לתוך פרויקט חדש, ושם הוא כן עובד... המסקנה שאני הצלחתי להגיע אליה היא או שהספריות שאני עובד בהן הן שונות, או שבאחת מהן הקובץ פגום, אלא שנסיתי עם כמה קבצים שונים, ולכן קשה לי להאמין...
 

vinney

Well-known member
אבל 0X0000 זה NULL, לא?

רוצה לשים תמונת מסך של הWATCH שיהיה יותר ברור למה אתה מתכוון?
 

tseliot

New member
בבקשה...

המצביע עצמו לא בכתובת 0X0000, זה משהו אחר שמצוין בכתובת הזו...
 

vinney

Well-known member
המםם.

theFile זה ה*FILE שלך, אני מבין... זה מה שfopen החזיר לך? איך נראית הקריאה לfopen? זה קובץ שנוצר, או פתחת קובץ קיים? לקריאה או לכתיבה? מה הקוד שעושה לך בעיות?
 

tseliot

New member
הקוד:

void Read() { FILE* theFile=fopen("a.bmp","r"); if(theFile==NULL){return;}​
זאת ההתחלה של הקוד, ומשם אני מקבל את הפוינטר המנוול
כמו שאמרתי, הוא לא NULL לכן לא יכול להיות שהוא לא מוצא את הקובץ... זה קובץ קיים, ופתחתי אותו לקריאה, כמו שרואים.
 

tseliot

New member
כל דבר שאני אעשה עם הפוינטר אח"כ

מעיף אותי (הפוינטר מסומן בווטץ' כלא תקין). אפילו השורה ferror(theFile גורמת לתוכנה לקרוס... מה יכול לגרום לfopen להחזיק פוינטר, אבל אחד לא תקין?
 

galh

New member
מה אתה מנסה לעשות עם הפוייטר?

צילום המסך שהבאת הוא תקין לחלוטין. קיבלת מצביע לקובץ, השדות שלו לא יאותחלו עד שתקרא או תכתוב לקובץ. תמשיך להביא קוד.
 

tseliot

New member
אם הוא תקין לחלוטין...

מה המשמעות של ה<BAD PTR> שמסומן שם? ולמה בתכנית השניה(שכן עובדת) הכתובת שאני מקבל בשביל הפוינטר היא כתובת נורמאלית ואין את ה<BAD PTR>?
 

galh

New member
זה אומר שזה Bad Pointer. ../images/Emo3.gif

תבדיל בין המצביע ל- FILE לבין השדות של המבנה שעליו הוא מצביע. לסטודיו יש אופציה נחמדה של AutoExp שמאפשרת לך "להגיד" לו איך להציג מבנים מורכבים (struct או class). במקרה של FILE הוא מציג את ptr_ ועוד כמה דברים. ptr_ הוא מצביע שהערך שלו הוא NULL, כלומר <BAD PTR>, אבל המצביע ל- FILE הוא תקין. אני לא יודע מה ההבדל בין התוכניות בלי לראות את הקוד. תנסה לעשות Rebuild All.
 

tseliot

New member
אז מה זה הptr_ הזה?

על מה הוא (אמור) להצביע? אין ולו הבדל אחד בין התוכניות. כדי להיות בטוח עשיתי COPYPASTE של הקוד עצמו...הניחוש היחיד שיש לי זה אולי בגלל שכל תוכנית נמצאת בספריה אחרת אז לאחת הקובץ כן תקין ולשניה לא (בשתי הספריות יש עותק של הקובץ)...
 

vinney

Well-known member
זה לא צריך לעניין אותך בכלל

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

tseliot

New member
בכל מקרה, הנה דוגמאות קוד:

if(ferror(theFile))//Program Breaks Down ... int* i=new int(); fread(i,sizeof(int),1,theFile);//Program Breaks Down​
אני חייב לצין שfclose כן עובד...
 

vinney

Well-known member
זה יהיה מוגזם לבקש שתראה את הכל?

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

tseliot

New member
טוב בסדר ../images/Emo13.gif

הקוד השלם:
void Read() { FILE* theFile=fopen("a.bmp","r"); if(theFile==NULL){return;} int* i =new int(); fread(theFile,sizeof(int),1,i); fclose(theFile); delete i; }​
ברור שכרגע זה לא מה שהייתי רוצה שהפונקציה באמת תעשה, אבל חזרתי כרגע לפונקציה הבסיסית הזו רק כדי להבין מה לא הולך לי. כרגע אני עף מהתוכנה ברגע שאני קורא לפונקציה fread.
 

vinney

Well-known member
נו ברור שזה עף

*FILE זה הפרמטר הרביעי של הפונקציה, לא הראשון.
 

tseliot

New member
זה ככה גם אצלי...

המחשב שאני מתכנת עליו לא מחובר לאינטרנט, ולא העתקתי נכון...
 
למעלה