קבצים
הוצג| English | משמעות |
|---|---|
| file/faɪl/ | קובץ |
| text file/tekst faɪl/ | קובץ טקסט |
| secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ | אחסון משני |
| persistence/pəˈsɪstəns/ | שימור |
| end of file/end ɒv faɪl/ | סוף קובץ |
| separator/ˈsepəreɪtə/ | מפריד |
| sequential/siːˈkwenʃl/ | עקיב |
המשחק שזכר
- עד 1987, כיבוי קונסולת משחקים מחק הכל. כל ישיבה התחילה מהמסך הראשון; משחק ארוך היה אחר צהריים ארוך או לא כלום.
- The Legend of Zelda הוצא עם סוללה קטנה בתוך הקארט'ריש שהשאירה כמה מאות בייטים פעילים. לראשונה, משחק הבית יכול was שמור, ולהמשיק מהנקודה בה נותר.
- כל שיא גבוה, כל מסמך, כל הגדרה ששמרתם קיימים מאותה סיבה: RAM שוכח כשהחשמל נכבה, וקובץ לא.
- שיעור זה הוא הסיבה לקיום קבצים וכיצד מדומים (pseudocode) קוראים וכותבים קובץ טקסט, שורה אחר שורה.
למה קבצים
- משתנים חיים ב-RAM ונעלמים כאשר התוכנית נגמרת. קובץ באחסון משני שומר על נתונים בין הפעלות התוכנית: עמידות (persistence).
- קבצים מאפשרים לתוצאות של תוכנית אחת להיות קלט לתוכנית אחרת, כך שנתונים יכולים להיות משותפים.
- קובץ יכול להכיל יותר מהנכנס בזיכרון, ותוכנית יכולה להתחיל מחדש ממצב שמור.

המשתנה נעלם בסוף הריצה; הקובץ עדיין קיים למחר
מדוע תוכנית כותבת נתונים לקובץ במקום לשמור אותם במשתנה?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
RAM הוא וולטילי, ולכן הנתונים מאבדים אם יוצאים מהתוכנית. קובץ באחסון משני נשמר בין הפעלות שונות.
קבצי טקסט ושלושה מצבים
- קובץ טקסט מאחסן נתונים בשורות של תווים, אותם תוכנית קוראת וכותבת שורה אחת על ידי אחת, מהתחלה. סדרת השורות הזו היא מה שמאפשר ללולאה לעבור עליהן.
OPENFILE … FOR READקורא מהשורה הראשונה.FOR WRITEיוצר קובץ חדש, או כוסה קובץ קיים.FOR APPENDמוסיף שורות חדשות בסוף, תוך שמירה על מה שקיים.- לפתוח לפני השימוש, לסגור לאחריו. לקובץ יש מצב אחד בכל פעם.
התאם כל מצב פתיחת קובץ לפעולה שהוא מבצע.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
READ מקרא; WRITE מחליף מחדש; APPEND מוסיף לסוף ללא אובדן המידע הקיים.
כדי להוסיף שורות לסוף של קובץ קיים ללא אובדן התוכן שלו, פתח אותו FOR ____.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
WRITE יתחיל את הקובץ ריק. APPEND ישמר את הקיים וכותב לאחריו.
קריאת כל השורות
OPENFILE "data.txt" FOR READ
WHILE NOT EOF("data.txt") DO
READFILE "data.txt", LineString
OUTPUT LineString
ENDWHILE
CLOSEFILE "data.txt"
EOFבודק את סוף הקובץ. בדוק אותו לפני כל קריאה: קריאה מעבר לסוף היא שגיאה.CLOSEFILEחשוב: נתוני ה-Buffer עלולים להיאבד ותוכניות אחרות לא יוכלו לגשת לקובץ שנותר פתוח.
טיפול בקובץ: פתיחה → שימוש → סגירה
עבור על מחזור החיים של כל קובץ. שני חלקים שקל לשכוח הם בדיקת EOF בזמן קריאה בתוך לולאה, וסגירה תמידית בסוף.
מה בודק EOF?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
נבדק EOF (סוף קובץ) לפני כל פעולת קריאה, כך שהלולאה נעצרת כאשר אין עוד נתונים.
מדוע יש לסגול תמיד קובץ לאחר שימוש בו?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
סגירת הקובץ גורמת לשטוף את הכתיבות הממונות לדיסק ולשחרר את הנעילה כדי שאפשר יהיה לתוכניות אחרות להשתמש בקובץ.
כתיבת שורות
OPENFILE "log.txt" FOR WRITE
FOR i ← 1 TO 100
WRITEFILE "log.txt", "Event " & NUM_TO_STR(i)
NEXT i
CLOSEFILE "log.txt"
WRITEמתחיל עם קובץ ריק. כדי להוסיף ליומן שצריך לשמור את ההיסטוריה שלו, פתוח אותוFOR APPENDבמקום זאת.- קובץ טקסט מכיל מחרוזות: מספר מומר עם
NUM_TO_STRבצירוף היציאה.
דוגמה פתורה: שלוש השורות האחרונות בקובץ
- כתוב פרוצדורה
LastLines(FileName)שתפלט את שלוש השורות האחרונות של קובץ טקסט, בסדר.
PROCEDURE LastLines(BYVAL FileName : STRING)
DECLARE LineX, LineY, LineZ : STRING
LineX ← ""
LineY ← ""
LineZ ← ""
OPENFILE FileName FOR READ
WHILE NOT EOF(FileName) DO
LineX ← LineY
LineY ← LineZ
READFILE FileName, LineZ
ENDWHILE
CLOSEFILE FileName
OUTPUT LineX
OUTPUT LineY
OUTPUT LineZ
ENDPROCEDURE
- כל שורה חדשה דוחפת את הקודמות, כך שב
EOFשלושת המשתנים מחזיקים את שלוש השורות האחרונות; קובץ קצר יותר מפלט מחרוזות ריקות. עבור הפיחמש שורות הראשונות, ספור את הקריאות ועצור בחמישה או בEOF, מי שהופיע ראשון. קובץ ריק גורם לEOFלהיות אמיתי מיד לאחר הפתיחה.
סדרו את שלבי ההליכה LastLines בסדר המתאים.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
התחלה, פתיחה, לולאה עם העברה לפני הקריאה, סגירה, הצגה. העברה אחרי הקריאה תאבד את השורה החדשה ביותר.
שדות בשורה
- הרקורד נכתב כשורה אחת, השדות שלו מחוברים באמצעות תווית מפריד, ומספר או בוליאן ממורים עם
NUM_TO_STR(וקוראים אותם חזרה עםSTR_TO_NUM, או על ידי השוואה ל"TRUE"). - בחר מפריד שלא יכול לעולם להופיע בנתונים: פסיק או
|לשמות ומספרים; לעולם אל תשתמש במרווח כאשר שם עשוי להכיל אחד. - קריאה חזרה: קרא את השורה, חלק אותה בפסיק, ממור כל שדה לסוג שלו, ואחסן אותו ברקורד.

חדור עם מפריד לכתיבה; חלק וממור לקריאה
שורה מאחסנת שם מלא ומשקל של שחקן. איזה תווית הפרדה הוא הבחירה בטוחה ביותר?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
המפריד לא יכול להופיע לעולם בתוך שדה. שם מלא מכיל רווח, וציון מכיל ספרות.
מספר שלם (INTEGER) ניתן לכתוב לקובץ טקסט ישירות, ללא המרה למחרוזת תחילה.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
קובץ טקסט מכיל שורות של תווים. השתמש ב-NUM_TO_STR לכתיבה וב-STR_TO_NUM לקריאה חוזרת.
דוגמה פתורה: שמירת רשומה, טעינה חוזרת
- רשומה
Playerמכילה שדותName : STRINGוScore : INTEGER. כתוב פסאודו-קוד להוספתה לscores.txtבשורה אחת, ולקריאת שורה אחת חזרה לתוך הרשומה.
OPENFILE "scores.txt" FOR APPEND
WRITEFILE "scores.txt", Player.Name & "," & NUM_TO_STR(Player.Score)
CLOSEFILE "scores.txt"
OPENFILE "scores.txt" FOR READ
READFILE "scores.txt", Line
Pos ← POSITION(Line, ",")
Player.Name ← LEFT(Line, Pos - 1)
Player.Score ← STR_TO_NUM(MID(Line, Pos + 1, LENGTH(Line) - Pos))
CLOSEFILE "scores.txt"
- הציונים: המצב הנכון, ההמרה בין כיוונים של המספר, תווית הפרדה שאינה יכולה להופיע בשם, וסגירת שני הקבצים.
כדי לאחסן רשומה בשורה אחת בקובץ טקסט, התוכנית צריכה: לבחור את כל האפשרויות החלות.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
המרה, חיבור, כתיבה, סגירה. לקובץ טקסט אין פריסה בינארית; זאת עושה קובץ בינארי.
גישה סדרתית וגישה ישירה
- קובץ טקסט הוא סדרתי (רציף): הוא נקרא בסדר מהתחלה, ולכן מציאת שורה מסוימת דורשת קריאה בכל השורות שקדמו לה.
- גישה ישירה (אקראית) מקפצת ישר אל רשומה במיקום מחושב ללא קריאת האחרות; היא דורשת רשומות באורך קבוע, שהן אינן קיימות בקובצי טקסט.
- עבור התוכנית לימודים, לולאת קובץ הטקסט לעיל היא הדגם: פתיחה, בדיקת
EOF, קריאה, סגירה.
גישה ישירה (אקראית) מאפשרת לתוכנית לקפוץ ישר לרשומה מבלי לקרוא את שאר הרשומות קודם.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
גישה סדרתית דורשת קריאה מהתחלה.
סימונים נופלים מהיד
- קריאה מעבר לסוף. בדוק
EOFלפני כלREADFILE. - פתיחת
FOR WRITEכאשר הקובץ צריך לשמר את תוכנו. זהוAPPEND. - כתיבת מספר ללא
NUM_TO_STR, או קריאתו חזרה ללאSTR_TO_NUM. קובץ טקסט מאחסן מחרוזות. - שכחון
CLOSEFILE, או שימוש בקובץ לפניOPENFILE. שניהם מאבדים את ציון הטיפול בקובץ.
הבנתך מושלמת
- קבצים מספקים עמידות: הנתונים שורדים את סוף התוכנית, ניתנים לשימוש משותף, ועלולים לעלות על זיכרון הגישה האקראית.
OPENFILE … FOR READ | WRITE | APPEND→READFILE/WRITEFILE→CLOSEFILE;WRITEכותב מחדש,APPENDמוסיף בסוף- בדוק
EOFלפני כל קריאה; המר מספרים עםNUM_TO_STRבחוצה וSTR_TO_NUMבחזרה - רשומה אחת = שורה אחת, שדות מחוברים על ידי תווית הפרדה שלא מופעת לעולם בנתונים