On this page
מערך שיעור: קבצים — File, StreamReader/Writer
משך: 2 שעות אקדמיות (90 דקות).
מטרת השיעור: הסטודנטים ידעו לשמור נתונים לקובץ ולקרוא אותם חזרה, עם ניהול משאבים נכון באמצעות using.
בסוף השיעור הסטודנטים צריכים: להשתמש ב-File/StreamWriter/StreamReader לכתיבה וקריאה, להסביר למה using נחוץ, ולעטוף פעולות קובץ ב-try/catch מתאים.
דגש קריטי: הדגישו שנתוני זיכרון “נעלמים” בסגירת התוכנית — זו הבעיה הבסיסית שכל השיעור פותר, ולא מובנת מאליה לסטודנטים שרק כתבו קוד קונסולה עד כה.
מהלך השיעור
| חלק בשיעור | משך | הערות ודגשים |
|---|---|---|
| פתיחה וחיבור | 5 דקות | הריצו תוכנית עם רשימה בזיכרון, סגרו וידגימו שהנתונים נעלמו |
| הרעיון: File.WriteAllText/ReadAllText | 15 דקות | הדרך הפשוטה ביותר |
| StreamWriter/StreamReader | 20 דקות | שורה-שורה, יעילות לקבצים גדולים |
| הבעיה: משאב לא סגור | 10 דקות | הראו (או תארו) קובץ “תקוע” בלי using |
| הרעיון: using | 15 דקות | סגירה אוטומטית, גם עם חריגה |
| try/catch סביב IO | 10 דקות | File.Exists + IOException יחד |
| תרגול מודרך | 15 דקות | תרגיל 1+2 |
דגשים להעברת השיעור
- ההדגמה הפותחת (נתונים “נעלמים” בסגירת תוכנית) חייבת להיות מוחשית — הריצו תוכנית עם List בזיכרון, מלאו אותה, סגרו וההריצו מחדש כדי להראות שהיא ריקה שוב.
- קשרו
usingבחזרה ל-finallyשכבר מוכר מהיחידה הקודמת — “זה בדיוק אותו רעיון, בתחביר מובנה יעודי למשאבים”. - הפרויקט המסכם של היחידה (Naive Bayes) ישתמש בקריאת CSV גדול — כדאי לרמוז על כך כאן, כדי לחבר את הנושא לפרויקט שמתקרב.
מושגים
File.ReadAllText/WriteAllText — קריאה/כתיבה שלמה בפעולה אחת.
StreamReader/StreamWriter — קריאה/כתיבה שורה-שורה, יעילים לקבצים גדולים.
using — מבטיח סגירת משאב אוטומטית, גם בחריגה.
תרגיל חשיבה
שאלת פתיחה: “אם שוכחים לסגור StreamWriter שפתחתם לקובץ, ומריצים את התוכנית שוב מיד אחר כך — מה יכול להשתבש?”
מהלך: תנו לסטודנטים לשער — קובץ “נעול” על ידי התהליך הקודם, שגיאת גישה בהרצה השנייה, או נתונים שלא נשמרו בפועל (כי ה-buffer לא נוקה). הובילו לתובנה ש"סגירה" היא לא רק ניקיון קוד — היא בעלת השלכות אמיתיות על משאבי מערכת ההפעלה.
מה המרצה מראה בסוף: אם אפשר בבטחה, הדגימו קובץ שנשאר “תפוס” (למשל ניסיון למחוק אותו בסייר הקבצים בזמן שהתוכנית עדיין רצה בלי using/Dispose) — לעומת אותו תרחיש עם using, שבו הקובץ משתחרר מיד אחרי שהבלוק מסתיים.