לוגו/טיפול בקבצים
טיפול בקבצים
[עריכה]העבודה עם קבצים היא חלק חשוב בעבודת המתכנת. האפשרות לקלוט כמויות גדולות של מידע מתוך קבצים והאפשרות לשמור כמויות גדולות של נתונים שעובדו, נותנות בידי המתכנת עוצמה רבה. אמנם, הטיפול בקבצים דורש התעסקות ב"אינסטלציה" של ניהול המידע במחשב, אך זו השקעה משתלמת.
בשפת לוגו, העבודה עם קבצים כוללת ארבעה שלבים מרכזיים:
- פתיחת הקובץ: בשלב זה נציין אם הקובץ מיועד לכתיבה, קריאה, הוספה או עדכון.
- קביעת הקובץ: בשלב זה נורה ללוגו כי קובץ מסויים יהיה קובץ הקריאה, או קובץ הכתיבה, הנוכחי.
- עבודה עם הקובץ: ביצוע הכתיבה לקובץ או הקריאה ממנו.
- סגירת הקובץ: פינוי משאבי המחשב באופן מסודר, המונע יצירת קבצים פגומים.
בפיסקאות הבאות נראה כיצד עלינו לטפל בארבעת השלבים הללו.
פתיחת הקובץ
[עריכה]שלב הפתיחה הוא השלב שבו נקבע אופן העבודה עם הקובץ. האפשרויות הן:
- openread: הקובץ נפתח לשם קריאה ממנו.
- openwrite: הקובץ נפתח לשם כתיבה אליו.
- openappend: הקובץ נפתח לשם הוספת נתונים לסופו.
- openupdate: הקובץ נכתב לשם כתיבה וקריאה.
- מדוע עלינו להצהיר מראש על הסיבה לפתיחת הקובץ? לכאורה, ניתן היה לפתוח קבצים בעזרת פקודה כללית (open) ואז להחליט בעצמנו אם לכתוב אל הקובץ או לקרוא אליו. הטעם להצהרה-מראש נעוץ בחשש מפני מחיקת נתונים או יצירת קבצים מיותרים. כאשר אנו מכריזים מראש שקובץ מסויים נועד לקריאה בלבד, אנו מונעים את האפשרות למחוק אותו בטעות על-ידי כתיבה. כאשר אנו פותחים אותו ל"הוספת נתונים" בלבד, אנו מונעים את מחיקת המידע שכבר קיים בו, וכו'.
- מדוע עלינו להצהיר מראש על הסיבה לפתיחת הקובץ? לכאורה, ניתן היה לפתוח קבצים בעזרת פקודה כללית (open) ואז להחליט בעצמנו אם לכתוב אל הקובץ או לקרוא אליו. הטעם להצהרה-מראש נעוץ בחשש מפני מחיקת נתונים או יצירת קבצים מיותרים. כאשר אנו מכריזים מראש שקובץ מסויים נועד לקריאה בלבד, אנו מונעים את האפשרות למחוק אותו בטעות על-ידי כתיבה. כאשר אנו פותחים אותו ל"הוספת נתונים" בלבד, אנו מונעים את מחיקת המידע שכבר קיים בו, וכו'.
פקודות הפתיחה מקבלות כקלט שם של קובץ, לדוגמה:
- openread "c:/logo/kovetz.txt
- שימו לב לסימן הגרשיים, בראש שם הקובץ, המבטיח שלוגו לא תחשוב שמדובר בשם של הליך ותנסה לבצע אותו.
- openread "c:/logo/kovetz.txt
קביעת הקובץ
[עריכה]הכתיבה לקבצים והקריאה מהן מתבצעות בלוגו בעזרת פקודות הכתיבה למסך (print, show, type) ובעזרת פקודות הקריאה מהמקלדת (readchar ואחיותיה). אין בלוגו פקודות מיוחדות לכתיבה לקבצים ולכן איננו יכולים להורות למחשב במפורש "כתוב את המידע הבא לקובץ kovetz.txt". במקום זאת, אנו מבצעים מהלך כפול: בשלב הראשון אנו מורים למחשב להפסיק להדפיס את הפלט אל המסך ולהתחיל להזרים אותו לקובץ מסויים. בשלב השני אנו מורים למחשב להדפיס את המידע המבוקש, וההדפסה מופנית אל הקובץ שבחרנו.
דרך פעולתה של לוגו מאפשרת לנו לשמור כמה אפיקי קלט ופלט פתוחים בו-זמנית. בכל רגע נתון רק אחד מהם הוא אפיק הקלט הפעיל ורק אחד מהם הוא אפיק הפלט הפעיל, וכל פקודת הדפסה או קריאה מנותבת אוטומטית אל האפיק הפעיל. אנו יכולים גם להחזיר את הפלט אל הצג, או לפתוח את המקלדת לקלט חדש מן המשתמש. התנאי היחיד הוא, שבכל רגע נתון יהיה מוגדר רק אפיק קלט אחד ורק אפיק פלט אחד.
- קביעת אפיק הפלט נקבעת בעזרת הפקודה setwrite
- קביעת אפיק הקלט נקבעת בעזרת הפקודה setread
גם פקודות אלה מקבלות קלט. הקלט - בדיוק כמו בפקודות הפתיחה - הוא שם קובץ, והקובץ חייב להיות פתוח כבר. כאשר אנו מקצים אפיק פלט חדש (באמצעות setwrite), אנו חייבים לתת את שמו של קובץ שנפתח לקריאה או לשם "עידכון" (כתיבה וקריאה). אפיק הפלט (הנקבע בעזרת setread) חייב להיות קובץ שנפתח לכתיבה, להוספה או לעידכון.
כדי להחזיר את הקלט והפלט לאפיקים ה"רגילים" שלהם, יש להעביר לפקודות קביעת הקובץ קלט של רשימה ריקה ("[]"): []setread הופך את המקלדת לאפיק הקלט הפעיל ו-[] setwrite הופך את המסך לאפיק הפלט הפעיל.
כתיבה וקריאה
[עריכה]כאמור, מרגע שקובץ מסויים נקבע כאפיק הפלט, כל הדפסה תופנה אליו. בדומה לכך, מרגע שקובץ מסויים נקבע כאפיק הפלט, כל קריאה באמצעות הפקודה readchar - ובאמצעות פקודות הקריאה האחרות - לא תהיה קריאה של קלט מהמקלדת, אלא של נתונים מהקובץ.
- print מדפיסה בכל פעם שורה חדשה לתוך הקובץ. רשימות מודפסות ללא סימן הסוגריים המרובעים, יש תו רווח בין פריטים שונים ובסוף כל שורה "נשתל" תו ירידת-שורה.
- type מדפיסה בכל פעם פריט פלט חדש לתוך הקובץ, ללא הפרדה אוטומטית וללא ירידות שורה אוטומטיות.
- show מדפיסה לקובץ פריטי מידע מעובדים, כמו הפקודה print, אך רשימות מודפסות כשהן מוקפות בסוגריים מרובעים.
- readchar תחזיר בכל פעם תו נוסף מתוך הקובץ. הפקודה אינה מוחקת את התווים שהוחזרו כבר, אלא שומרת במשתנה מיוחד את מספרו של התו הבא שאותו עליה להביא. משתנה זה מתקדם בצעד אחד בכל פעם שאנו קוראים תו נוסף.
- readchars (זיכרו להחליף את הסימן # במספר חיובי שלם) תחזיר בכל פעם מספר תווים נוסף מתוך הקובץ. המשתנה, השומר את מקומו של התו הבא לקריאה, מתקדם בכל פעם מספר צעדים לפי מספר התווים שהוחזרו.
- readword מחזירה את כל תוכנו של הקובץ, כ"מילה" אחת ארוכה.
- readlist מחזירה את כל תוכנו של הקובץ, כרשימה מחולקת למילים.
לוגו מאפשרת לנו לשלוט במשתנה הקובע מה יהיה מקומו של התו הבא שייקרא מן הקובץ, וכן במשתנה נוסף, הקובע היכן תתבצע הכתיבה הבאה לתוך הקובץ. בשני המקרים מדובר במשתנים המכילים ערך מספרי שלם.
- הפקודה readpos מחזירה כפלט את מספרו בקובץ של התו הבא שייקרא בעזרת פקודות הקריאה. כאשר אנו מתחילים לקרוא מקובץ מסויים, המספר שיוחזר יהיה 0.
- הפקודה writepos מחזירה כפלט את המקום בקובץ, שאליו ייכתב התו הבא בעזרת פקודות הכתיבה. בדרך-כלל, מקום זה יהיה בסופו של הקובץ.
- הפקודה # setreadpos מאפשרת לנו לקבוע מקום חדש שממנו תתחיל הקריאה.
- הפקודה # setwritepos קובעת מקום חדש שממנו תתחיל הכתיבה לקובץ.
לאחר כל קריאה מהקובץ, עלול להיווצר מצב שבו אין עוד מידע באפיק הקלט. לוגו מחזיקה משתנה מיוחד, שערכו יכול להיות true או false ("משתנה בוליאני"), בעזרתו אפשר לדעת האם הגענו לסוף הקובץ או לא.
- הפקודה eofp מחזירה כקלט את ערכו של משתנה זה. אם הפקודה מחזירה true, משמעות הדבר היא שאין עוד מידע שניתן לקרוא. לוגו נמצאת כרגע בסוף קובץ הקלט שלה, וכדי לקבל קלט חדש יש לעבור לקובץ קלט אחר או לבקש קלט חדש מהמשתמש.
סגירת הקובץ
[עריכה]סגירת הקבצים היא חיונית לצורך פינוי משאבי מחשב. בנוסף, סגירה מסודרת של קבצים מונעת תקלות של כתיבה לקובץ הלא נכון או קריאה מהקובץ הלא נכון. לוגו מאפשרת מעקב אחרי הקבצים הפתוחים, סגירה של קובץ ספציפי ואף סגירה של כל הקבצים הפתוחים.
- סגירת קבצים נעשית באמצעות הפקודה close. פקודה זו מקבלת כקלט את שם הקובץ לסגירה, בדיוק כמו פקודות הפתיחה ופקודות קביעת הקובץ.
- כדי לברר אילו קבצים פתוחים כרגע, נשתמש בפקודה allopen. פקודה זו מחזירה רשימת-לוגו, ובה שמות כל הקבצים שטרם נסגרו.
- הפקודה closeall מבצעת עבורנו סגירה של כל הקבצים הפתוחים.
סגירת הקבצים אינה משנה באופן אוטומטי את המקום שאליו יופנה הפלט של התוכנית ואת המקום שבו מחפשת התוכנית את הקלט. לפיכך, לפני סגירת קובץ הקריאה וקובץ הכתיבה יש לזכור להפנות את אפיקי הקלט והפלט בחזרה אל המקלדת ואל המסך, בעזרת הפקודות []setread ו []setwrite. אם איננו בטוחים מהו קובץ הכתיבה ומהו קובץ הקריאה, נוכל לברר זאת בעזרת הפקודות הבאות:
- reader היא פקודה המחזירה את שמו של קובץ הקריאה הנוכחי (הקובץ שממנו מצפה התוכנית לקבל קלט). אם אפיק הקלט הנוכחי הוא המקלדת, הפקודה תחזיר כפלט רשימה ריקה ([]).
- writer היא הפקודה שתחזיר את שמו של קובץ הכתיבה הנוכחי (הקובץ שאליו תשלח התוכנית את הפלט). אם אפיק הפלט הנוכחי הוא המסך, הפקודה תחזיר כפלט רשימה ריקה ([]).
מחיקת קובץ
[עריכה]לוגו מאפשרת לנו למחוק קבצים מיותרים בעזרת הפקודה erasefile. גם פקודה זו מצפה, כמובן, לקבל כקלט את שמו של קובץ הקיים במערכת הקבצים. אסור שהקובץ יהיה פתוח (לא לקריאה, לא לכתיבה, לא להוספה ולא לעידכון).
הפרק הקודם: קלט ופלט |
טיפול בקבצים | - |