הפונקציה fopen

vinney

Well-known member
אז אני לא יודע

הרצתי אצלי את :
#include <stdio.h> void Read() { FILE* theFile=fopen("a.bmp","r"); if(theFile==NULL){return;} int* i =new int(); fread(i,sizeof(int),1,theFile); fclose(theFile); delete i; } int main(void) { Read(); return 0; }​
וזה עובד נהדר. תשמע, אין הפתעות בדברים האלה, יש לך באג, תמצא אותו. בכל מקרה, זה נראה כאילו אתה עובד ב++C. אם כך, למה אתה לא עובד בstreamים? למה לך בכלל להתעסק עם *FILE? מה גם שאתה קורא קבצי נתונים בינאריים...
 

tseliot

New member
חשבתי שאני עובד בסטרימים...

עד עכשיו אף פעם לא התעסקתי עם קריאה/כתיבה לקבצים... מה ההבדל? ואיזה כותר מכיל את הסטרימים ומה הפונקציות?
 

tseliot

New member
אגב, יש סיכוי שזו בעיה של הרשאה?

לדוגמא, אם הקובץ אמור להיות מוסתר או משהו? למרות שהוא לא, אבל אני רוצה לדעת על מה השגיאה הזו מעידה...
 

vinney

Well-known member
לא נראה לי

הוא אמור להתמודד עם כל מה שמערכת ההפעלה מתמודדת איתו, זה יותר נראה כמו זליגת זכרון/stack corruption או כל מיני דברים מהסוג הזה. תבדוק מה קורא מסביב, לפני הפונקציה הזאת, איפשהו מישהו דופק משהו שמתמטא בתעופה הזאת. לגבי סטרימים - יש את iostream לסטנדרטיים, fstream לקבצים, ועוד כמה STLים לצרכים אחרים, שהם לא עבודה עם קבצים (אתה יכול לעבוד עם כל דבר בעצם בתור stream). מדובר במחלקות, שאפשר להוריש, ותבניות, שאפשר לבנות לכל טיפוס לפי הצורך. זה יחסוך לך הרבה מאוד שורות קוד, תלמד את זה.
 

tseliot

New member
אוקי... אז מה בעצם אני מחפש?

מה יכול לגרום לבאג לפני הפונקציה הנוכחית? מה אני מחפש? אין לי שום פתיחה של קובץ או התעסקות עם STREAM לפני זה... מה זה STACK CORRUPTION? אני מבין מילולית מה זה, אבל מתי זה קורה?
 

vinney

Well-known member
כל דבר

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

tseliot

New member
כן, ניסיתי לראות מה קורה בתוך fread

רק שלא הבנתי כלום ממה שהולך שם... אגב, היה נדמה לי שקראתי בMSDN שתמיד צריך לעשות CAST למצביע לCHAR כדי לקרוא דרכן, בגלל זה לא השתמשתי בהן...
 

vinney

Well-known member
נכון

אבל זה נעשה אוטומטית. רצוי לעשות את זה, האמת. אצלי זה רץ בלי שום cast.
 

tseliot

New member
סוף סוף...

פתרתי את הבעיה, אבל על ידי מעבר לofstream (תודה לויני). עם fopen זה עדין לא עובד, אבל זה לא עקרוני... אגב, אני כן מחויב לעשות CAST למצביע לCHAR...
 

vinney

Well-known member
זה לא אותו דבר

פה אתה מקצה מערך בגודל 1 של int, אתה עושה עליו [] delete אחרי זה. ()int זה מופע בודד של משתנה מסוג int, ואפשר גם לכתוב את זה בלי סוגריים.
 

vinney

Well-known member
אגב, בדוגמא הקודמת שהבאת

רשמת את הקריאה נכון. איך זה ?
 

® רן

New member
מצטרף לשרשור שלכם

יש לי שני רעיונות מה אולי לא בסדר: 1. fopen למיטב זכרוני פותח את הקובץ כטקסט, לא בינארי. אם אתה רוצה בינארי (וכנראה אתה רוצה, כי זה BMP), תשתמש ב "rb" ולא "r". כלומר:
FILE* theFile=fopen("a.bmp","rb");​
2. תריץ את אותה תוכנית על קבצים שונים, ככה תוכל לבודד אם הבעיה בקובץ או בתוכנית. האם זה עף על כל קובץ, או רק על הספציפי הזה? מה גודל הקובץ? אולי הוא בגודל 0 ואתה מנסה לקרוא מעבר לסופו?
 

tseliot

New member
אז ככה...

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

vinney

Well-known member
אין כזה דבר קבצי טקסט

ה"b" או ה"t" משפיעים אך ורק על התייחסות לn\ - אם זה "t" - יתווסף אוטומטית "r\" במערכות DOSיות. זה הכל, זה כל ההשפעה.
 

® רן

New member
אתה סותר את עצמך

ברור שכל קובץ בסופו של דבר מאוחסן בצורה בינארית בדיסק. נכון גם שאין "באמת" דבר כזה קובץ טקסט. אבל, פתיחת קובץ כטקסט גורמת להתייחסות מיוחדת לתווי האסקי 13 ו- 10 (CR ו LF). זה דבר שכנראה אתה לא רוצה לעשות בקבצי BMP.
 
למעלה