סיכום הרצאה

‫© אגף התקשוב‪ ,‬אוניברסיטת בר אילן‬
‫ד"ר סמדר שץ‬
‫קורס תוכנת מטלב ויישומיה‬
‫קורס תוכנת מטלב ויישומיה‬
‫שיעור מס' ‪ :5‬משתני טקסט‬
‫נתונים טקסטואליים‬
‫נתונים טקסטואליים מופיעים בהקשרים הבאים‪:‬‬
‫‪ ‬נתונים לתוכנית‪ .‬לדוגמא‪ :‬שמות אנשים‪ ,‬ערים‪ ,‬מוצרים וכו' וכן טקסטים שלמים למשל ספרים‪.‬‬
‫‪ ‬שמות בקוד עצמו‪ .‬לדוגמא‪ :‬שמות משתנים‪ ,‬קבצים‪.‬‬
‫‪ ‬אנוטציה בגרפיקה‪ :‬כותרות לצירים ולגרף‪ ,‬מקרא‪ ,‬טקסט חופשי‪.‬‬
‫‪ ‬מאפיינים שונים לפעולות בתוכנית‪ .‬לדוגמא‪ :‬סימונים לצבעים ולסגנון קו בגרפיקה (פקודת ‪ ,)plot‬פורמט כתיבה לקובץ גרפי‬
‫(פקודת ‪ ,)print‬וכן פקודות שנראה בהמשך שיעור זה‪.‬‬
‫מהם תווים ומחרוזות תווים‬
‫תו הוא יחידת ‪-‬מידע שמתייחסת לסימן גרפי‪ .‬דוגמה פשוטה לתו היא אחת מאותיות האלפבית‪ .‬תווים כוללים גם את סימני הספרות‪,‬‬
‫סימני פיסוק‪ ,‬סימנים מיוחדים (למשל @ או ‪ ,)$‬וכן סימן רווח‪ .‬תווי ‪-‬בקרה הם תווים שאינם ניתנים לקריאה אבל מסמנים הוראות‬
‫להצגה של תווים אחרים‪ ,‬לדוגמא‪ :‬מעבר לשורה חדשה‪ ,‬קפיצה (סימן טאב)‪ ,‬חזרה אחורה מקום אחד ועוד‪.‬‬
‫במחשב תווים מיוצגים ע"י קודים‪ ,‬שהם ערכים מספריים‪ .‬ההתאמה בין התווים לקודים שלהם נקראת קידוד‪ .‬קיימות כיום מערכות‬
‫קידוד רבות‪ ,‬ביניהן קוד ‪ UTF8 ,ascii‬ועוד‪ .‬בגירסאות מוקדמות של מטלב הוכר רק קידוד ‪ .ascii‬כיום ניתן לעבוד עם כל קידוד‬
‫המוכר ע"י המערכת‪ ,‬כאשר ניתן גם לשנות את ברירת המחדל לקידוד‪.‬‬
‫מחרוזת תווים היא שורה מסודרת של תווים‪ .‬דוגמא פשוטה היא שורת‪-‬טקסט‪ .‬במטלב מחרוזת תווים היא מערך חד‪-‬ממדי של‬
‫תווים‪( .‬במטלב ניתן ליצור גם מערכי תווים רב‪-‬ממדיים)‪.‬‬
‫מטלב מציין קבועי ‪-‬מחרוזת (מחרוזות שהן חלק מן התוכנית עצמה) בצבע ייחודי‪.‬‬
‫עבודה עם משתני טקסט‬
‫יצירת מחרוזות‬
‫בדומה לנתונים מספריים‪ ,‬אפשרות אחת ליצירת משתני מחרוזת היא קריאה מקובץ (על כך בהמשך)‪.‬‬
‫ליצירת מחרוזות בתוך התוכנית‪ ,‬הצורה הנפוצה ביותר היא ע"י כתיבת האותיות בין גרשיים‪.‬‬
‫'!' = ‪mychar‬‬
‫= ‪mychar‬‬
‫!‬
‫'‪mysay = 'This is a string‬‬
‫= ‪mysay‬‬
‫‪This is a string‬‬
‫)‪char(80‬‬
‫= ‪ans‬‬
‫‪P‬‬
‫)‪char(40:50‬‬
‫= ‪ans‬‬
‫‪()*+,-./012‬‬
‫)‪blanks(n‬‬
‫ליצירת תו בודד‪:‬‬
‫ליצירת מחרוזת‪:‬‬
‫יצירת תו מתוך הקידוד שלו‬
‫יצירת מחרוזת מתוך סדרת קודים‬
‫יצירת מחרוזת של ‪ n‬תווי רווח‬
‫המרה ממספר למחרוזת‪ ,‬כלומר‪ :‬מחרוזת התווים שמייצגת באופן קריא את המספר‬
‫עמ' ‪ 1‬מתוך ‪9‬‬
‫שיעור ‪5‬‬
‫)‪num2str(x‬‬
‫אפריל ‪15‬‬
‫קורס תוכנת מטלב ויישומיה‬
‫© אגף התקשוב‪ ,‬אוניברסיטת בר אילן‬
‫ד"ר סמדר שץ‬
‫)‪num2str(x,n‬‬
‫לכלול לא יותר מ‪ n-‬ספרות משמעותיות‪:‬‬
‫)‪int2str(x‬‬
‫המרה למחרוזת של החלק השלם בלבד של מספר (החלק השברי מושמט)‬
‫פעולות ‪-‬מערך על מחרוזות‬
‫מאחר שמחרוזות הן מערכים‪ ,‬כל הפעולות המוגדרות במטלב על מערכים מוגדרות גם על מחרוזות‪.‬‬
‫]‪yoursay = [mysay mychar‬‬
‫= ‪yoursay‬‬
‫!‪This is a string‬‬
‫;‪x = 3.5‬‬
‫' ‪msg = ['The value of x is:‬‬
‫])‪num2str(x‬‬
‫= ‪msg‬‬
‫‪The value of x is: 3.5‬‬
‫למשל שרשור‪:‬‬
‫כך יש לבנות טקסט להצגת מספר‪:‬‬
‫)‪yoursay(3:7‬‬
‫= ‪ans‬‬
‫‪is is‬‬
‫]' ‪names=['Ruthi';'Moshe';'Avram';'Dana‬‬
‫= ‪names‬‬
‫‪Ruthi‬‬
‫‪Moshe‬‬
‫‪Avram‬‬
‫‪Dana‬‬
‫שליפת חלק ממחרוזת‪:‬‬
‫ניתן ליצור גם מערכי תווים דו‪-‬ממדיים‪,‬‬
‫אבל רק אם כל המחרוזות באותו אורך‪.‬‬
‫(אם לא‪ ,‬ניתן "לרפד" את המחרוזות הקצרות יותר ברווחים‪ .‬צורת‬
‫עבודה זו פחות נוחה ובהמשך נכיר סוגי משתנים שמתאימים יותר‬
‫לעבודות עם קבוצות של מחרוזות)‪.‬‬
‫◄דוגמא ‪ :1‬שרשרת ‪ DNA‬בנויה משני "גדילים" המחוברים ביניהם לאורכם‪ .‬כל "גדיל" בנוי מסדרה של בסיסים שמסומנים‬
‫באותיות ‪ .G,A,T,C‬הגדילים מאורגנים כך שמול הבסיס ‪ G‬בגדיל אחד נמצא הבסיס ‪ C‬בגדיל שני‪ ,‬מול ‪ C‬נמצא ‪ ,G‬מול ‪ A‬נמצא ‪T‬‬
‫ומול ‪ T‬נמצא ‪ .A‬הסקריפט ‪ d5pairs‬מייצג שרשרת ‪ DNA‬באורך ‪ n‬ע"י שתי שורות של אותיות (כל "גדיל" בשורה) כלומר מערך‬
‫‪ . 2xn‬את השורה הראשונה "מגרילים" באופן אקראי‪ ,‬ואת השורה השנייה בונים בהתאם לשורה הראשונה‪.‬‬
‫‪n=30; d5pairs‬‬
‫= ‪DNA‬‬
‫‪GCCAAACAGCAGAGGCCTGGACGGGTTTAT‬‬
‫‪CGGTTTGTCGTCTCCGGACCTGCCCAAATA‬‬
‫פקודות לטיפול במחרוזות‬
‫קיימות פקודות רבות לטיפול במחרוזות‪ .‬לרשימה מלאה‪ ,‬יש לחפש בתיעוד לפי ‪ .strings‬להלן כמה מן הפקודות השכיחות‪:‬‬
‫הסרת כל הרווחים לפני הסימן הראשון ואחרי הסימן האחרון שאינם רווחים‪( .‬משאירה רווחים‬
‫)‪strtrim(strng‬‬
‫בין הסימנים שאינם רווחים)‪.‬‬
‫)'‪str2double('5.1e-3‬‬
‫= ‪ans‬‬
‫‪0.0051‬‬
‫)‪str2num(strng‬‬
‫המרה ממחרוזת למספר אחד‪.‬‬
‫אם המחרוזת לא מצייגת מספר‪ ,‬מתקבל ‪.NaN‬‬
‫המרה ממחרוזת למספר‪/‬ים (יכול לפענח גם סדרה של מספרים)‪.‬‬
‫חיפוש מחרוזת ‪ substr‬בתוך מחרוזת אחרת ‪ .strall‬אם נמצא‪ ,‬מתקבל האינדקס בתוך ‪strall‬‬
‫שבו נמצא התו הראשון של ‪( . substr‬אם יותר מפעם אחת‪ ,‬מתקבל מערך של אינדקסים)‪.‬‬
‫השוואה בין שתי מחרוזות‪ .‬מתקבל ‪ true‬אם שתי המחרוזות זהות‪ false ,‬אחרת‪.‬‬
‫)‪strfind(strall,substr‬‬
‫)'‪strfind(mysay,'is‬‬
‫= ‪ans‬‬
‫‪3‬‬
‫‪6‬‬
‫)‪strcmp(str1,str2‬‬
‫שאלה ‪ :‬מדוע לא מספיקה השוואה == ויש להשתמש בפקודת ‪?strcmp‬‬
‫עמ' ‪ 2‬מתוך ‪9‬‬
‫שיעור ‪5‬‬
‫אפריל ‪15‬‬
‫קורס תוכנת מטלב ויישומיה‬
‫© אגף התקשוב‪ ,‬אוניברסיטת בר אילן‬
‫ד"ר סמדר שץ‬
‫עבודה עם קבצים‬
‫קובץ הוא אוסף של נתונים שהמערכת מתייחסת אליהם כאל יחידה אחת‪.‬‬
‫לקובץ מספר מאפיינים‪ ,‬לדוגמא‪:‬‬
‫‪ ‬שם הקובץ‬
‫‪ ‬תוכן הקובץ ‪ -‬המידע הנמצא על אמצעי האכסון‪.‬‬
‫‪ ‬גודל הקובץ ‪ -‬מס' הבתים שתופס באמצעי‪-‬האכסון‪.‬‬
‫‪ ‬תאריכים (יצירה‪ ,‬שינוי)‪.‬‬
‫‪ ‬הרשאות (אילו משתמשים רשאים לעשות בו פעולות שונות)‪.‬‬
‫‪ ‬מידע על מיקום הקובץ באמצעי האכסון‪ :‬מידע זה שקוף למשתמש‪ ,‬ונמצא בניהול המערכת‪.‬‬
‫תיקייה היא סוג מיוחד של קובץ‪ ,‬שכולל מידע על קבצים אחרים‪ .‬קבצים אלה שייכים לתיקייה (נמצאים בתוכה)‪ .‬חלק מן הקבצים‬
‫יכול להיות תיקיות‪.‬‬
‫קיים סימון של המערכת ל"שיוך" של קובץ לתיקייה‪ :‬הסימן \ במערכת ‪ Windows‬והסימן ‪ /‬במערכת ‪ .Linux‬לדוגמא‬
‫‪ c:\lib1\lib2\myfile.txt‬פירושו שהתיקייה ‪ lib1‬נמצא ברמה העליונה של דיסק ‪ ,C‬התיקייה ‪ lib2‬נמצאת בתיקייה ‪ lib1‬והקובץ‬
‫‪ myfile.txt‬נמצא בתיקייה ‪.lib2‬‬
‫‪ path‬הוא ה"מסלול" שמוביל מהרמה העליונה של אמצעי האכסון לתיקייה שבה נמצא קובץ‪ ,‬במקרה שלמעלה ‪c:\lib1\lib2‬‬
‫שם מלא של קובץ כולל גם את השם וגם את ה‪ ,path-‬כלומר ‪c:\lib1\lib2\myfile.txt‬‬
‫פקודות מערכת לטיפול בקבצים‬
‫לרשימה המלאה של פקודות לטיפול בקבצים‪ ,‬יש לחפש ‪ files‬בתיעוד‪ .‬להלן כמה פקודות שימושיות‪.‬‬
‫הארגומנטים של קלט ו‪/‬או פלט בכל הפקודות הבאות הם מחרוזות תוים (שמות של קבצים)‪:‬‬
‫‪pwd‬‬
‫ה‪ path-‬המלא לתיקייה בה נמצאים‪.‬‬
‫‪cd mydir‬‬
‫מעבר לתיקייה ‪ .mydir‬אם אין ‪ path‬מלא‪ ,‬מטלב מחפש את ‪ mydir‬תחת התיקייה הקיימת‪.‬‬
‫‪delete myfile‬‬
‫מחיקת קובץ ‪myfile‬‬
‫‪copyfile ffrom fto‬‬
‫העתקת קובץ ‪ ffrom‬לקובץ ‪fto‬‬
‫בניית שם מלא של קובץ מחלקיו‪ ,‬תוך הכנסת סימן התיקייה המתאים למערכת (‪,Windows‬‬
‫‪fullfile fdir fname‬‬
‫‪fullfile data-files pictures pic1.png‬‬
‫= ‪ans‬‬
‫‪data-files\pictures\pic1.png‬‬
‫‪ Linux‬וכו')‪ .‬לדוגמא‪:‬‬
‫פורמט פונקציה לעומת פורמט פקודה‬
‫במטלב אפשר לכתוב פקודות בשתי צורות‪:‬‬
‫פורמט פונקציה‬
‫פורמט פקודה‬
‫‪command arg1 arg2‬‬
‫הארגומנטים מפוענחים כטקסט‬
‫)‪command(arg1,arg2‬‬
‫מה שלא מוגדר בין גר שיים‪ ,‬מפוענח כקלט רגיל‪ :‬אותיות‬
‫כשמות משתנים‪ ,‬מספרים כמספרים‪.‬‬
‫לא מתקבל פלט שניתן לשמור במשתנה‪.‬‬
‫פלט יתקבל לפי הגדרת הפקודה‪.‬‬
‫שמות ספציפיים הם חלק מן הפקודה‪.‬‬
‫מאפשר גמישות כאשר שמות ניתנים ע"י משתני מחרוזת‪.‬‬
‫עמ' ‪ 3‬מתוך ‪9‬‬
‫שיעור ‪5‬‬
‫אפריל ‪15‬‬
‫© אגף התקשוב‪ ,‬אוניברסיטת בר אילן‬
‫ד"ר סמדר שץ‬
‫קורס תוכנת מטלב ויישומיה‬
‫פורמט פונקציה‬
‫פורמט פקודה‬
‫‪save results.txt alltab -ascii‬‬
‫)'‪save(myfile,'alltab','-ascii‬‬
‫המשתנה ‪ alltab‬ייכתב לקובץ ששמו הוא המחרוזת במשנה‬
‫תמיד יווצר קובץ בשם ‪results.txt‬‬
‫‪.myfile‬‬
‫‪load acid.txt‬‬
‫)‪spectra = load(myfile‬‬
‫ייקרא תוכנו של הקובץ ששמו הוא המחרוזת שבמשתנה‬
‫תמיד יווצר משתנה בשם ‪acid.txt‬‬
‫‪ .myfile‬אחרי הקריאה הנתונים נשמרים במשתנה ‪.spectra‬‬
‫‪print myplot.pdf -dpdf‬‬
‫)'‪print(myplot,'-dpdf‬‬
‫הפלוט יישמר בפורמט ‪ PDF‬בקובץ ששמו הוא המחרוזת‬
‫שבמשתנה ‪.myplot‬‬
‫תמיד יווצר קובץ בשם ‪.myplot.pdf‬‬
‫‪cd mydir‬‬
‫)‪cd(mydir‬‬
‫מעבר לתיקייה ששמה הוא המחרוזת שבמשתנה ‪.mydir‬‬
‫מעבר לתיקייה ‪.mydir‬‬
‫‪copyfile a.txt b.txt‬‬
‫)‪copyfile(file_a,file_b‬‬
‫הקובץ ששמו הוא המחרוזת במשתנה ‪ file_a‬יועתק לקובץ‬
‫תמיד יועתק קובץ ‪ a.txt‬לקובץ ‪.b.txt‬‬
‫ששמו הוא המחרוזת במשתנה ‪.file_b‬‬
‫בחירת קובץ מתוך רשימה‬
‫הפקודות הבאות מציגות למשתמש רשימה של קבצים לפי קריטריון מסוים (‪ ,)pattern‬ועוצרות את התוכנית עד שהמשתמש בוחר‬
‫באמצעות העכבר את אחד הקבצים‪ .‬המשתמש יכול לעבור לתיקיות אחרות‪ ,‬גם כאלה שנמצאות מעל לתיקייה הנוכחית‪ .‬מתקבל‬
‫שם ‪-‬קובץ (אותו אפשר לשמור במשתנה מחרוזת)‪.‬‬
‫בחירת קובץ לקריאה‪ :‬יש לבחור שם קובץ קיים‪.‬‬
‫)‪[FName,PName] = uigetfile(pattern,title‬‬
‫בחירת קובץ לשמירה‪ :‬ניתן לבחור שם קיים או‬
‫)‪[FName,PName] = uiputfile(pattern,title‬‬
‫להזין שם שאינו קיים‪.‬‬
‫בחירת תיקייה‪:‬‬
‫)‪Pname = uigetdir(start_path,title‬‬
‫בכל הפקודות האלה‪:‬‬
‫שם קובץ (ללא ‪.)path‬‬
‫‪FName‬‬
‫שם של תיקייה‪ ,‬בצורת ‪ path‬מלא‪.‬‬
‫‪PName‬‬
‫‪pattern‬‬
‫תבנית לבחירה‪ ,‬בדרך כלל בשילוב * המסמן תווים כלשהם‪.‬‬
‫כדי לאפשר בחירת קובץ כלשהו בתיקייה כלשהי‪ ,‬יש לציין *‪*.‬‬
‫‪title‬‬
‫כותרת‪ ,‬טקסט על פס‪-‬הכותרת של חלונית הבחירה‪.‬‬
‫ניתן להשמיט ‪ title‬ואז תופיע כותרת ברירת ‪-‬מחדל‪.‬‬
‫ניתן להשמיט ‪ Pname‬ואז ידוע רק שם הקובץ (לא מומלץ‪ ,‬מאחר שאין לצפות את תגובת המשתמש)‪.‬‬
‫◄דוגמא ‪ :2‬הסקריפט ‪ d5plot_ecology‬מבצע את הדברים הבאים‪:‬‬
‫א‪ .‬נותן למשתמש לבחור קובץ מתוך רשימת קבצי ‪.LGDW*.mat‬‬
‫ב‪ .‬קורא את הקובץ‪ ,‬ומשרטט את אוכלוסיות האנטילופות והעשב כפונקציה של הזמן‪.‬‬
‫ג‪ .‬מוצא את נקודת המינימום של אוכלוסיית האנטילופות ומוסיף על הגרף ליד נקודה זו את ערכי הזמן והאוכלוסייה‪.‬‬
‫ד‪ .‬כותב ככותרת לגרף פרמטרים נוספים של המערכת‪.‬‬
‫ה‪ .‬שומר את הציור לקובץ ‪ ,PDF‬כאשר שם הקובץ זהה לשם קובץ הנתונים‪.‬‬
‫עמ' ‪ 4‬מתוך ‪9‬‬
‫שיעור ‪5‬‬
‫אפריל ‪15‬‬
‫© אגף התקשוב‪ ,‬אוניברסיטת בר אילן‬
‫ד"ר סמדר שץ‬
‫קורס תוכנת מטלב ויישומיה‬
‫‪Water supply = 4.02, W0 = 20.05, L0 = 20‬‬
‫‪65‬‬
‫‪deer‬‬
‫‪grass‬‬
‫‪60‬‬
‫‪55‬‬
‫‪50‬‬
‫‪population‬‬
‫‪45‬‬
‫‪40‬‬
‫‪35‬‬
‫‪30‬‬
‫)‪(29.4685,28.2276‬‬
‫‪100‬‬
‫‪90‬‬
‫‪80‬‬
‫‪70‬‬
‫‪60‬‬
‫‪50‬‬
‫‪time‬‬
‫‪30‬‬
‫‪40‬‬
‫‪20‬‬
‫‪0‬‬
‫‪10‬‬
‫‪25‬‬
‫קלט‪/‬פלט‬
‫קלט מן המשתמש‬
‫קלט מן המקלדת‪ :‬פקודת ‪ input‬מציגה מחרוזת תווים ‪ , prompt‬עוצרת את ביצוע התכנית ומאפשרת למשתמש להקיש על‬
‫המקלדת‪ .‬לאחר שהמשתמש מקיש על >‪ ,<ENTER‬כל מה שהוקש מהצגת ה‪ prompt-‬ועד מקש זה‪ ,‬מתקבל כפלט של הפקודה‪.‬‬
‫קיימות שתי צורות לפקודה‪:‬‬
‫)‪resp = input(prompt‬‬
‫קלט מפוענח ‪ :‬מטלב מנסה לפענח את התווים שהוקשו כאילו‬
‫הוקלדו בחלון הפקודות‪ ,‬והתוצאה נשמרת במשתנה ‪.resp‬‬
‫)'‪raw = input(prompt,'s‬‬
‫קלט גולמי‪ :‬התווים מועברים למשתנה ‪ raw‬כפי שהוקשו‪.‬‬
‫בחירת אפשרות מתוך תפריט‪ :‬פקודת ‪ menu‬מציגה חלונית עם עמודה של כפתורים‪ ,‬עוצרת את ביצוע התוכנית ומאפשרת‬
‫למשתמש להקיש על אחד מן הכפתורים עם העכבר‪ .‬הפלט ‪ n‬של הפקודה הוא המספר הסידורי של הכפתור עליו הוקש‪.‬‬
‫אופן השימוש בפקודה‪:‬‬
‫)‪n = menu(title,b1,b2,...,bN‬‬
‫‪title‬‬
‫כותרת‪ ,‬טקסט שיופיע מעל עמודת הכפתורים‪.‬‬
‫‪b1, b2, ...bN‬‬
‫מחרוזות טקסט‪ ,‬כל אחת תווית על כפתור בתפריט‪.‬‬
‫◄דוגמא ‪ :3‬הסקריפט ‪ d5births‬מבצע את הדברים הבאים‪:‬‬
‫‪13000‬‬
‫‪feb‬‬
‫‪aug‬‬
‫א‪ .‬קורא נתוני לידות מקובץ ומציג כפונקציה של הזמן את נתוני כל‬
‫החודשים‪.‬‬
‫‪12000‬‬
‫‪11000‬‬
‫ב‪ .‬נותן למשתמש לבחור עמודה‪ ,‬צבע ומרקר‪.‬‬
‫‪10000‬‬
‫ג‪ .‬חוזר על הבחירה עבור חודש נוסף‪.‬‬
‫‪9000‬‬
‫ד‪ .‬מנקה את הפלוט‪ ,‬מצייר רק את נתוני שני החודשים שנבחרו‪ ,‬עם‬
‫‪8000‬‬
‫הצבעים והמרקרים שנבחרו‪ ,‬ומציג מקרא‪.‬‬
‫‪7000‬‬
‫‪6000‬‬
‫‪2005‬‬
‫עמ' ‪ 5‬מתוך ‪9‬‬
‫שיעור ‪5‬‬
‫‪2000‬‬
‫‪1995‬‬
‫‪1990‬‬
‫‪1985‬‬
‫‪1980‬‬
‫‪1975‬‬
‫‪5000‬‬
‫‪1970‬‬
‫אפריל ‪15‬‬
‫© אגף התקשוב‪ ,‬אוניברסיטת בר אילן‬
‫ד"ר סמדר שץ‬
‫קורס תוכנת מטלב ויישומיה‬
‫קלט‪/‬פלט מפורש‬
‫עד כה הכרנו פקודות שמבצעות קלט‪/‬פלט על קובץ שלם‪ ,‬בצורה שקופה לתוכנית‪ .‬הפקודות בהמשך מאפשרות לקרוא או לכתוב‬
‫לקובץ בשלבים‪.‬‬
‫כל קובץ מסתיים בסימן ‪ end-of-file‬המציין למערכת את קצה הנתונים בקובץ‪( .‬זה אינו מספר או אחד מן הסימנים האפשריים‬
‫כחלק מן הנתונים)‪.‬‬
‫בכל רגע נתון בטיפול בקובץ‪ ,‬המערכת קוראת או כותבת למקום מסוים בקובץ‪ .‬המערכת עוקבת אחרי מקום זה באמצעות ה‪file -‬‬
‫‪.pointer‬‬
‫בדרך כלל‪ ,‬פעולת כתיבה או קריאה בודדת לא מתבצעת ישירות לאמצעי‪-‬האכסון‪ ,‬אלא ל"חוצץ" (‪ :)buffer‬אזור שבו המערכת‬
‫מכינה את הנתונים הנקראים‪/‬נכתבים לקובץ‪ .‬במטלב פעולה זו שקופה למשתמש‪.‬‬
‫הליך קריאה או כתיבה לקובץ כולל את השלבים הבאים‪:‬‬
‫‪ ‬פתיחת הקובץ‪ :‬מציאת הקובץ לפי שם מלא‪ ,‬איסוף מידע (מקום פיסי של הקובץ ומאפיינים נוספים)‪ ,‬הקצאת ה‪,buffer-‬‬
‫הצבת ה‪ file pointer-‬בהתחלת הקובץ‪ .‬כל המידע הזה שקוף למשתמש‪ ,‬וניתן לגשת לקובץ רק ע"י מציין ‪ File-ID‬שמצביע‬
‫על אוסף המידע שהמערכת שומרת לגבי הקובץ בכל זמן עיבודו‪.‬‬
‫‪ ‬כתיבה או קריאה לקובץ (אפשר יותר מפעולה אחת)‪.‬‬
‫‪ ‬סגירת הקובץ‪ :‬כתיבת ה‪ buffer-‬לאמצעי האכסון‪ ,‬כתיבת ‪( end-of-file‬אם רלוונטי)‪.‬‬
‫תוכנית שמשתמשת בקלט‪/‬פלט מפורש כוללת פקודות המבצעות את השלבים האלה‪ .‬הפקודות לפתיחה וסגירה של קובץ הן‪:‬‬
‫)‪fID = fopen(filename, action‬‬
‫פתיחת קובץ‪:‬‬
‫‪fID‬‬
‫מציין לקובץ (להתייחסות בהמשך)‬
‫‪filename‬‬
‫שם הקובץ‬
‫‪action‬‬
‫הפעולה‪/‬ות לביצוע בקובץ‬
‫אפשרויות עבור ‪:action‬‬
‫קריאה (ברירת מחדל)‬
‫'‪'r‬‬
‫כתיבה (גם על קובץ קיים)‬
‫'‪'w‬‬
‫הוספה לקובץ קיים (אם יש)‬
‫'‪'a‬‬
‫אפשרויות נוספות מפורטות בתיעוד של הפקודה‪.‬‬
‫סגירת קובץ‪:‬‬
‫סגירת כל הקבצים הפתוחים‪:‬‬
‫)‪fclose(fID‬‬
‫)'‪fclose('all‬‬
‫קלט‪/‬פלט מקבצי טקסט‬
‫קבצי טקסט כוללים רק קודים של תווים‪ .‬למרות שהקבצים מוצגים "בצורה דו ממדית" כלומר כאוסף של שורות זו מתחת לזו‪ ,‬כל‬
‫קובץ הוא סדרה אחת של תווים‪ .‬השורות מופרדות ביניהן בקובץ ע"י סימן ‪ newline‬שמצויין בתוכנית מטלב ע"י '‪.'\n‬‬
‫הערה‪ :‬בטיפול בקבצי טקסט במערכת ‪ ,Windows‬לפעמים יש להוסיף מציין '‪ 't‬ל‪ action-‬בפקודת ‪ fopen‬לקובץ טקסט כדי‬
‫שתוכנת ‪ NotePad‬תקרא את הקובץ כהלכה‪ .‬לדוגמא‪ ,‬במקום '‪ 'r‬לכתוב '‪( .'rt‬בקבצי טקסט ב‪ Windows-‬יש '‪ '\n\r‬כלומר גם חזרה‬
‫לראשית השורה במקום רק '‪ '\n‬כלומר מעבר לשורה חדשה)‪.‬‬
‫עמ' ‪ 6‬מתוך ‪9‬‬
‫שיעור ‪5‬‬
‫אפריל ‪15‬‬
‫ד"ר סמדר שץ‬
‫קורס תוכנת מטלב ויישומיה‬
‫© אגף התקשוב‪ ,‬אוניברסיטת בר אילן‬
‫קריאה של שורת טקסט‬
‫)‪strng = fgetl(fID‬‬
‫קריאת מחרוזת תווים מהמקום הנוכחי בקובץ ועד סוף השורה‪.‬‬
‫‪strng‬‬
‫אם נקראו תווים‪ :‬מחרוזת תווים (לאחר קידוד אך ללא פענוח תוכן)‪.‬‬
‫אם ה‪ file pointer-‬הקובץ‪ :‬מספר = ‪.-1‬‬
‫קריאה וכתיבה של טקסט לפי פורמט‬
‫הפורמט מציין את אופן ההמרה בין ייצוג פנימי (בינארי) של משתנים במטלב לטקסט קריא (מחרוזות תווים)‪ .‬פקודת ‪format‬‬
‫במטלב שהכרנו בשיעורים קודמים מגדירה כמה צורות המרה נתונות‪ ,‬לצורך הצגה בחלון הפקודות‪ .‬קלט‪/‬פלט מפורש מאפשר ציון‬
‫מגוון רחב יותר של פורמטים‪.‬‬
‫פורמט במטלב הוא מחרוזת תווים‪ .‬המחרוזת יכולה לכלול "תווים חופשיים" אשר לא מתפענחים (נקראים או נכתבים כפי שהם‬
‫מופיעים בפורמט)‪ ,‬וכן "שדות" שכל אח ד מהם מגדיר צורת המרה לגודל סקלרי (מספר או מחרוזת) אחד‪ .‬בתוך הפורמט‪ ,‬מזהים‬
‫את התחלת השדה בסימן ‪ %‬ואת סוף השדה לפי קוד ההמרה‪ .‬כמו ‪-‬כן אפשר לציין את רוחב השדה ‪ w‬שהוא מספר התווים‬
‫שהשדה יתפוס לאחר המרה‪ ,‬וכן מאפיינים נוספים הרלוונטיים לכל סוג‪.‬‬
‫במידה ורוחב השדה עולה על מספר התווים הנוצרים מן ההמרה‪ ,‬התווים מיושרים לימין ו"מרופדים" בתווי רווח משמאל‪.‬‬
‫להלן כמה סוגי שדות ומאפיינים נפוצים‪:‬‬
‫תו בודד‬
‫‪%c‬‬
‫מחרוזת תווים‬
‫‪%s‬‬
‫רוחב שדה ‪w‬‬
‫‪%ws‬‬
‫‪%d‬‬
‫מספר (עשרוני) שלם‬
‫רוחב שדה ‪w‬‬
‫"ריפוד" באפסים במקום בתווי רווח‪.‬‬
‫‪%wd‬‬
‫‪%0wd‬‬
‫‪%f‬‬
‫מספר עשרוני עם נקודה קבועה‪.‬‬
‫רוחב שדה ‪ ,w‬מתוכו ‪ p‬ספרות אחרי הנקודה‬
‫"ריפוד" באפסים במקום בתווי רווח‪.‬‬
‫‪%w.pf‬‬
‫‪%0w.pf‬‬
‫‪%e‬‬
‫מספר עשרוני עם נקודה צפה‪.‬‬
‫רוחב שדה ‪ ,w‬מתוכו ‪ p‬ספרות אחרי הנקודה‬
‫"ריפוד" באפסים במקום בתווי רווח‪.‬‬
‫‪%w.pe‬‬
‫‪%0w.pe‬‬
‫כתיבה ע"י פורמט‬
‫)‪fprintf(fID,format,A1,...,An‬‬
‫הפקודה לכתיבה לקובץ היא‪:‬‬
‫‪fID‬‬
‫מציין לקובץ‪ .‬אם מושמט‪ ,‬הפלט נכתב לחלון הפקודות‪.‬‬
‫‪format‬‬
‫מחרוזת הפורמט‬
‫ערכים להמרה‪ .‬יכולים להיות ביטויים כלשהם (לא רק שמות משתנים)‪.‬‬
‫‪A1,A2, ...An‬‬
‫מטלב עובר על כל הערכים במשתנים (לפי הסדר שבו הם מופיעים בפקודה) ובהתאמה על כל השדות שבפורמט‪ .‬כל ערך מומר‬
‫בהתאם למאפייני השדה המתאים בפורמט‪.‬‬
‫אם משתנה הוא מערך‪ ,‬אז קודם ממירים את כל האיברים שלו ורק אז עוברים למשתנה הבא‪ .‬במקרה של מערך עם ‪ 2‬ממדים או‬
‫יותר‪ ,‬עוברים על כל האברים בסדר שבו הם נמצאים בזיכרון ‪ -‬לפי עמודות‪.‬‬
‫עמ' ‪ 7‬מתוך ‪9‬‬
‫שיעור ‪5‬‬
‫אפריל ‪15‬‬
‫© אגף התקשוב‪ ,‬אוניברסיטת בר אילן‬
‫ד"ר סמדר שץ‬
‫קורס תוכנת מטלב ויישומיה‬
‫אם השדו ת בפורמט "נגמרים" לפני שהומרו כל הערכים שבמשתנים‪ ,‬מטלב עושה בפורמט "שימוש חוזר"‪ .‬לדוגמא‪:‬‬
‫)‪rnd = rand(3,4‬‬
‫;'‪fmt = ' Col < %5.3f %5.1e %5.2f >\n‬‬
‫= ‪rnd‬‬
‫)‪fprintf(fmt,rnd‬‬
‫‪0.0357‬‬
‫‪0.7922‬‬
‫‪0.1419‬‬
‫‪0.9572‬‬
‫> ‪0.80‬‬
‫‪Col < 0.957 4.9e-01‬‬
‫‪0.8491‬‬
‫‪0.9595‬‬
‫‪0.4218‬‬
‫‪0.4854‬‬
‫> ‪0.92‬‬
‫‪Col < 0.142 4.2e-01‬‬
‫‪0.9340‬‬
‫‪0.6557‬‬
‫‪0.9157‬‬
‫‪0.8003‬‬
‫> ‪0.66‬‬
‫‪Col < 0.792 9.6e-01‬‬
‫> ‪0.93‬‬
‫‪Col < 0.036 8.5e-01‬‬
‫קריאה ע"י פורמט‬
‫ניתן לקרוא רק משתנה אחד‪ .‬אם כל הנתונים בקובץ מאותו סוג‪ ,‬ניתן לקרוא מערך בפקודה אחת‪.‬‬
‫)‪A = fscanf(fID,format‬‬
‫הנתונים שנקראו מהקובץ נשמרים במשתנה ‪.A‬‬
‫)‪A = fscanf(fileID, format, sA‬‬
‫ציון מספר האיברים (לכל היותר) לקריאה‪.‬‬
‫ציון הממדים של ‪ m :A‬שורות‪ n ,‬עמודות‪ .‬אם ‪ n=Inf‬אז קוראים עד סוף הקובץ‪.‬‬
‫)]‪A = fscanf(fileID, format, [m,n‬‬
‫במקרה שהפורמ ט כולל תווים מפורשים‪ ,‬מטלב מחפש את התווים האלה בקובץ‪ ,‬מדלג עליהם וממשיך לפענח את הקובץ לפי‬
‫השדה שאחרי התווים‪.‬‬
‫◄דוגמא ‪ :4‬הסקריפט ‪ d5write_ecology‬מבצע את הדברים הבאים‪:‬‬
‫א‪ .‬נותן למשתמש לבחור קובץ מתוך רשימת קבצי קבצי ‪.LGDW*.mat‬‬
‫ב‪ .‬מכין שם ‪-‬קובץ זהה לקובץ הנתונים‪ ,‬אבל עם סיומת ‪.txt‬‬
‫ג‪ .‬כותב לקובץ בשם זה שורת כותרת הכוללת ערכי פרמטרים של המערכת‪.‬‬
‫ד‪ .‬בשורה הבאה כותב כותרות לזמן ולאוכלוסיית האנטילופות‪ ,‬ובשורות הבאות את ערכי הזמן והאוכלוסיה‪.‬‬
‫◄דוגמא ‪ :5‬הסקריפט ‪d5read_ecology‬‬
‫‪file: LDGW15.txt, Water supply: 4.02‬‬
‫מבצע את הדברים הבאים‪:‬‬
‫‪50‬‬
‫א‪ .‬נותן למשתמש לבחור קובץ מתוך רשימת‬
‫‪45‬‬
‫קבצי ‪.LDGW*.txt‬‬
‫ב‪ .‬פותח את הקובץ לקריאה‪ ,‬ומדלג על‬
‫‪40‬‬
‫השורה הראשונה‪.‬‬
‫‪35‬‬
‫ג‪ .‬מן השורה השנייה‪ ,‬מחלץ את ערך‬
‫‪lions‬‬
‫‪deer‬‬
‫‪grass‬‬
‫‪water‬‬
‫אספקת המים‪.‬‬
‫ד‪ .‬מדלג על שתי השורות הבאות‪.‬‬
‫‪25‬‬
‫ה‪ .‬משרטט גרף של כל האוכלוסיות ומוסיף‬
‫‪population‬‬
‫‪30‬‬
‫‪20‬‬
‫מקרא‪.‬‬
‫‪15‬‬
‫ו‪ .‬מוסיף כותרת לגרף‪ :‬שם הקובץ המקורי ‪+‬‬
‫‪10‬‬
‫ערך אספקת המים‪.‬‬
‫‪5‬‬
‫‪100‬‬
‫עמ' ‪ 8‬מתוך ‪9‬‬
‫‪90‬‬
‫‪80‬‬
‫שיעור ‪5‬‬
‫‪70‬‬
‫‪60‬‬
‫‪50‬‬
‫‪time‬‬
‫‪40‬‬
‫‪30‬‬
‫‪20‬‬
‫‪10‬‬
‫‪0‬‬
‫אפריל ‪15‬‬
‫© אגף התקשוב‪ ,‬אוניברסיטת בר אילן‬
‫ד"ר סמדר שץ‬
‫קורס תוכנת מטלב ויישומיה‬
‫קריאה וכתיבה לקבצים בינאריים‬
‫קובץ בינארי כולל ייצוג בינארי של נתונים מסוגים שונים‪ ,‬באופן סדרתי‪.‬‬
‫בקריאה וכתיבה לקובץ בינארי קוראים בכל פעם נתונים מסוג מסוים‪ .‬מספר הבתים שנקרא או נכתב עבור כל נתון תלוי בסוג הנתון‪.‬‬
‫להלן כמה סוגי נתונים ומספר הבתים הכתובים בקובץ לכל נתון‪:‬‬
‫מספר בתים‬
‫מספר בתים‬
‫סוג‬
‫סוג‬
‫‪4‬‬
‫‪int, int32‬‬
‫‪4‬‬
‫‪single,float‬‬
‫‪2‬‬
‫‪int16,integer*2‬‬
‫‪8‬‬
‫‪double,float64‬‬
‫‪1‬‬
‫‪int8‬‬
‫‪1‬‬
‫‪char*1‬‬
‫‪1‬‬
‫‪uint8‬‬
‫תלוי בקידוד‬
‫‪char‬‬
‫סוגים נוספים נמצאים בתיעוד על פקודות ‪ . fread,fwrite‬אם לא מציינים את הסוג בגוף הפקודה‪ ,‬ברירת המחדל היא ‪.uint8‬‬
‫בכתיבה וקריאה של מערך‪ ,‬הנתונים נכנסים למערך לפי עמודות‪.‬‬
‫פקודות כתיבה‬
‫)‪fwrite(fID, A‬‬
‫כתיבת כל האיברים של ‪ A‬לקובץ‪.‬‬
‫‪ A‬יכול להיות גם ביטוי (לא רק שם של משתנה)‪.‬‬
‫ציון סוג הנתונים ‪dType‬‬
‫דוגמא‪:‬‬
‫)‪fwrite(fID, A, dType‬‬
‫)'‪fwrite(fID,rand(5),'double‬‬
‫פקודות קריאה‬
‫)‪A = fread(fID‬‬
‫קריאת כל התוכן של הקובץ למערך‪-‬עמודה ‪.A‬‬
‫)‪A = fread(fID,sA‬‬
‫ציון מספר הנתונים לקריאה‪.‬‬
‫)]‪A = fread(fID,[m,n‬‬
‫ציון ממדי המערך ‪( A‬כמו בפקודת ‪.)fscanf‬‬
‫ציון סוג הנתונים‪.‬‬
‫)‪A = fread(fID,[m,n],dType‬‬
‫עמ' ‪ 9‬מתוך ‪9‬‬
‫שיעור ‪5‬‬
‫אפריל ‪15‬‬