בעיה בעבודה עם קבצים

InfectedM

New member
בעיה בעבודה עם קבצים

אני מכניס מידע לקובץ בתור סטראקט פעמיים. כאשר אני מנסה לקרוא מהקובץ נעשית קריאה אחת מיותרת.
#include <iostream> #include <fstream> using namespace std; struct foo { char blah[30]; }; int main(void) { foo Moo; ofstream Out_File("dat.dat",ios::app); ifstream Input_File; strcpy(Moo.blah,"Moo"); Out_File.write((char *) &Moo,sizeof(foo)); strcpy(Moo.blah,"Moo2"); Out_File.write((char *) &Moo,sizeof(foo)); Out_File.close(); Input_File.open("dat.dat"); while (!Input_File.eof()) { Input_File.read((char *) &Moo, sizeof(foo)); cout << Moo.blah << endl; } return 1; }​
הפלט המתקבל הוא:
Moo Moo2 Moo2​
במקום:
Moo Moo2​
מדוע זה קורה? האם יש דרך אחרת לקרוא מהקובץ עד תומו? תודה רבה :)
 

vinney

Well-known member
פורום שפות תכנות ../images/Emo13.gif

שלא יכעסו עליי שם
לעניין - eof בודקת דגל EOF של הSTREAM. הדגל נדלק רק כשאתה קורא מעבר לגבולות הקובץ. בשתי הקריאות הראשונות אתה לפני סוף קובץ, כשהקריאה האחרונה שמה את הסמן על סוף הקובץ (אבל אתה לא קורא שם). בקריאה השלישית אתה קורא שם, ואז מקבל מחרוזת ריקה (כי אתה מסמן על סוף הקובץ => קראת 0 תוים + הדלקת את הדגל), אבל בזכרון אליו רצית לקרוא יש עדיין את מה שקראת בקריאה הקודמת, ואת זה אתה מדפיס. הפתרון הוא לא להסתפק בדגל EOF (שנותן לך התראה מאוחר מדי), אלא לבדוק אם הREAD הצליח.
 

InfectedM

New member
הבנתי. לפי התיעוד של הפונקציה read

היא לא מחזירה כלום. אז איך אוכל לבדוק שהפונקציה פעלה כראוי? לשמור את הקריאה האחרונה ולהשוות אותה מול הקריאה הראשונה לא נשמע לי כ"כ טוב. כי בפרוייקט שלי אני משתמש ברשומות עם יותר משדה אחד ויתכנו שינויים רק בחלק מהשדות. בקיצור, איך אוכל לבדוק שה read אכן התבצעה? תודה שוב!
 
למעלה