עבור לתוכן

הפונקציה EOF ב CP כיצד עובדים איתה?

Featured Replies

פורסם

שלום

אני יודע שהפונקציה EOF מחזירה TRUE כאשר בוצע ניסיון קריאה כושל ולא כאשר מגיעים לסוף הקובץ

ולכן חשוב לעשות משהו בסיגנון

infile.get(c);
while (!infile.eof()
{
outfile <<c;
infile.get(c);
}

ולא

while (!infile.eof()
{
infile.get(c);
outfile <<c;

}

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

אבל יש לי דוגמא שהפונקציה EOF לא עובדת כך

אני יוצר קובץ grades.txt

שמכיל את הטקסט 123

קטע הקוד הבא :


ifstream inGrade("grades.txt"); ofstream outRoster("roster.txt");
int tmpGrade; inGrade >> tmpGrade;
while (!inGrade.eof() ) { outRoster << tmpGrade <<endl ; inGrade >> tmpGrade; }

יצור לי את הקובץ roster.txt ריק

אבל אם אעשה

    ifstream inGrade("grades.txt");    ofstream outRoster("roster.txt");
int tmpGrade;

while (!inGrade.eof() ) { inGrade >> tmpGrade; outRoster << tmpGrade <<endl ; }

ייצור לי את הקובץ roster.txt עם הערך 123 ( הפונקציה eof החזירה FALSE כאשר הגעתי לסוף הקובץ ולא אחרי ניסיון קריאה כושל)

מדוע? זה צריך להיות הפוך...

תודה רבה

נערך על-ידי יוספי

פורסם
  • מחבר

את התיעוד קראתי..

true if the stream's eofbiterror state flag is set (which signals that the End-of-File has been reached by the last input operation).

false otherwise.

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

קודם צריך לנסות לקרוא ולא להצליח ואז היא תעבור ל TRUE

כך פעלתי בדוגמא הראשונה והשניה....הראשונה זה עבד השני זה לא עבד

איפה הטעות שלי?

נערך על-ידי יוספי

פורסם
גיל, זה ה-eof של C, לא של ++C. יוספי מדבר על הפונקציה eof:

http://www.cplusplus.com/reference/ios/ios/eof/

לערבב שתי שפות תכנות ביחד זה רעיון רע (בשלב הלימודים).

אם הוא מתכנת בC++ שישתמש בממשקים של C++.

פורסם

הוא אכן משתמש רק בממשקים של ++C, אני לא רואה מה הבעיה כאן.

פורסם
  • מחבר

אז מה הבעיה שלי?

פורסם

זה נובע מהאופן שבו קוראים לתוך int.

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

הדרך לבדוק אם קריאה בודדת לתוך int הצליחה היא ע"י בדיקת הפונקציה fail (בלי קשר ל-eof).

ארכיון

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

דיונים חדשים