עיבוד קבצים
הוצג| English | משמעות |
|---|---|
| overwrite/ˌəʊvəˈraɪt/ | כתיבה חוזרת |
| APPEND/əˈpend/ | הוספה |
| temporary file/ˈtemprəri faɪl/ | קובץ זמני |
לא ניתן לשנות שורה אחת בתיקון טקסט
- תוכנית צריכה לתקן סילוף במרכז קובץ לקוחות. נראה הגיוני: למצוא את השורה, לשנות אותה, ולשמור.
- כמעט אף שפה לא תאפשר זאת. קובץ טקסט הוא זרימת תווים, ושם המתוקן שונה באורכו מהשם הישן, ולכן כל байט לאחריו היה צריך להזז.
- לכן התשובה הסטנדרטית היא לא לערוך בכלל: העתק את הקובץ כולו, תוך שינוי שורה אחת בזמן מעבר, והנח את ההעתק במקום המקורי.
- שיעור זה עוסק בפעולות קובץ, בדוגמה של העתקה דרך מעבר כדי עדכון, ובמכשולים הגורמים לבגים אמיתיים.
הפעולות
OPENFILE name FOR READ | WRITE | APPENDפותח את הקובץ. READ פותח קובץ קיים בתחילה; WRITE יוצר אותו, או מוחק קובץ קיים; APPEND פותח אותו ומוסיף בסוף.READFILE name, variableקורא את השורה הבאה.WRITEFILE name, valueכותב שורה אחת.CLOSEFILE nameסוגר אותה.EOF(name)הוא TRUE כאשר הגיעו לסוף.- בחרו תחילה את עיצוב הקובץ ואת שיטת הגישה: קבצים סריים, רצופים ואקראיים משמשים הפעלות שונות. דוגמאות העתקה-דרכן כאן משתמשות בגישה רציפה לרשומות טקסט.
- הדפוס לקריאת קובץ שלם הוא תמיד אותו דבר:
OPENFILE "names.txt" FOR READ
WHILE NOT EOF("names.txt") DO
READFILE "names.txt", thisName
OUTPUT thisName
ENDWHILE
CLOSEFILE "names.txt"

פתח, השתמש, סגור, בכל פעם
מסלול גישה לקובץ
עקבו אחר קובץ מהאחסון לתוכנית וחזרה בבטחה.
מה עושה פתיחת קובץ FOR WRITE לתוכן הקיים?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
WRITE יוצר או כותב על הקובץ. כדי לשמור תוכן קיים ולהוסיף יותר, השתמש ב-APPEND.
התאם כל פעולת קובץ למה שהיא עושה.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
WRITE כותב על, APPEND מוסיף; EOF מסמן את הסוף; לולאת החיפוש נעצרת מוקדם ברגע שמצאו את הערך.
חיפוש בקובץ
- כדי לחפש, לקרוא שורה אחר שורה ולעצור כאשר נמצאת המטרה. נדרשים שני תנאים:
WHILE NOT EOF(…) AND NOT found. - הדגל
foundחשוב. ללאו, הלופ יקרא את כל הקובץ גם לאחר התאמה, מה שהוא חסכוני, ואין מה לבדוק לאחר מכן לדיווח "לא נמצא".
found ← FALSE
OPENFILE "names.txt" FOR READ
WHILE NOT EOF("names.txt") AND NOT found DO
READFILE "names.txt", thisName
IF thisName = target THEN
found ← TRUE
ENDIF
ENDWHILE
CLOSEFILE "names.txt"
כשמחפשים בקובץ ערך, התנאי של הלולאה כולל בדרך כלל:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
הפסקה ברגע המציאה מונעת קריאת שאר הקובץ ללא צורך.
מדוע לולאת חיפוש בקובץ משתמשת ב-WHILE NOT EOF AND NOT found? סמן כל האפשרויות הרלוונטיות.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
יש לסגור כל קובץ. שתי התנאים מטפלים ביציאה מוקדמת ובסוף הקובץ בהתאמה.
עדכון: דפוס הקובץ הזמני
- מכיוון שקובץ טקסט אינו ניתן לעריכה במוקום, עדכון משתמש בקובץ זמני.
- פתח את המקורי FOR READ וקובץ זמני FOR WRITE. קרא כל שורה בתור; כתוב אותה לקובץ הזמני או שונה או לא שונה.
- סגור את שני הקבצים, ולאחר מכן החלף את המקורי עם הקובץ הזמני.
- אותו דפוס עושה הכל: ל-מחוק רשומה, דלג על כתיבת שורה זו; ל-הכנס אחת, כתוב את השורה החדשה בנקודה הנכונה בזמן העתקה.
עדכון קובץ טקסט כאשר עריכה ב-Place אינה אפשרית, יש:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
להעתיק כל שורה (שנוחה או לא) לקובץ זמני, ולאחר מכן להחליף אותה במקור.
סדר את שלבי מחיקת רקורד אחד מקובץ טקסט.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
השלב האחרון הוא זה שהמועמדים נוטים לפספס, וללאו אין שינוי. אותו דגם משמש להוספה או לעריכת רקורד.
דוגמה פותרת: מחיקת רשומה
- תאר כיצד תוכנה מחקה רשומה אחת מקובץ טקסט. [4]
- פתח את הקובץ המקורי לקריאה וקובץ זמני לכתיבה.
- קרא כל שורה בתור. אם השורה אינה זו שמחקים, כתוב אותה לקובץ הזמני; אם כן, אל תכתוב אותה.
- כאשר מגיעים לסוף המקורי, סגור את שני הקבצים.
- החלף את הקובץ המקורי עם הקובץ הזמני. ארבעת השלבים זוכים נקודות, והשלב האחרון הוא זה שהמועמדים שוכחים.
תוכנית כותבת 500 רקורדים ואז נסגרת ללא סגירת הקובץ, והשורה האחרונות חסרות. מדוע?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
כתיבות מעובות לשיפור מהירות. סגירת הקובץ מנקה את המעבד, ועלולה גם לשחרר נעילה שאחרים מחכים לה.
הפחזות
- שכחת סגירה של קובץ: נתונים במבפר עשויים לעולם לא להיכתב, כך שהרשומות האחרונות נעלמות, והקובץ עשוי להישאר נעול מול תוכניות אחרות.
- פתיחה בFOR WRITE כאשר התכוונו ל-APPEND: כל תוכן הקובץ הקיים נמחק מיד ברגע הפתיחה, לפני כתיבת קו אחד.
- קריאה מעבר לסוף הקובץ (EOF): בדוק
EOFלפני כל פעולת קריאה, ולא אחריה. - נתיבים קבועים בתוכנה: השתמש בקבוע שם קובץ כך שיתופיע במקום אחד והתוכנית תוכל להעברה למחשב אחר.
שכחת סגירת קובץ עלולה לאבד כתיבות מעובות ולחסום אחרים — לכן יש לסגור תמיד קובץ בסיום העבודה.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
סגירה מנקה נתונים מעובים לדיסק ושחררת נעילה — בלובל FINALLY ניתן להבטיח זאת.
להוספת רשומות היום ליומן שצריך לשמור על היסטוריה, פתח את הקובץ FOR ____.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
WRITE הרס כל רשומה קודמת ברגע פתיחת הקובץ, לפני כתיבת שורה אחת.
דוגמה מפורטת: איזה מצב
- תוכנית מוסיפה עסקאות היום ליומן רציף שחייב לשמור את ההיסטוריה. APPEND: שימוש ב-WRITE ישמיד כל הקלטות הקודמות.
- תוכנית מייצרת דוח חדש כל לילה, תוך החלפת הדוח של אתמול. WRITE: יצירה או חילוף הם בדיוק מה שנדרש.
- תוכנית קוראת קובץ הגדרות בהפעלה. READ.
- המצב נבחר לפי מה שעובר על התוכן הקיים: שמירה והוספה, מחיקה, או השארה ללא שינוי.
סימונים נופלים מהיד
- דפוס העדכון מסתיים ב-החלפת המקורי בקובץ הזמני. העתקה ללא השלב הסופי הזה לא משנה דבר.
- לולאת חיפוש זקוקה לשתי התנאים,
NOT EOFוNOT found, ולמשהו לבדיקה לאחר מכן. - WRITE מחליף; APPEND מוסיף. בחירה שגויה תשמיד את הקובץ ברגע הפתיחה.
- תמיד
CLOSEFILE. הסבר: נתוני הBuffer עלולים להישכח אחרת.
הבנתך מושלמת
OPENFILE … FOR READ | WRITE | APPEND, ואזREADFILEאוWRITEFILE, ואזCLOSEFILE;EOFנבדק לפני כל קריאה- WRITE יוצר או מחליף, APPEND שומר על התוכן ומוסיף בסוף, READ מתחיל מהתחלה
- חפש עם
WHILE NOT EOF AND NOT found, כדי שהלולאה תיעצר מוקדם ו"לא נמצא" ידווח - עדכן על ידי העתקה דרך קובץ זמני, כתיבה בכל שורה ששונתה או נותרה ללא שינוי, דילוג על שורה למחיקה או הוספת שורה להכנסה, ואז החלפת המקורי