שיעור מס' 11: קלט/פלט מן המשתמש ומקבצים עבודה עם קבצים קובץ הוא אוסף של נתונים שהמערכת מתייחסת אליהם כאל יחידה אחת. לקובץ מספר מאפיינים, לדוגמא: שם הקובץ תוכן הקובץ - המידע הנמצא על אמצעי האכסון. גודל הקובץ - מס' הבתים שתופס באמצעי-האכסון. תאריכים )יצירה, שינוי(. הרשאות )אילו משתמשים רשאים לעשות בו פעולות שונות(. מידע על מיקום הקובץ באמצעי האכסון: מידע זה שקוף למשתמש, ונמצא בניהול המערכת. תיקייה היא סוג מיוחד של קובץ, שכולל מידע על קבצים אחרים. קבצים אלה שייכים לתיקייה )נמצאים בתוכה(. חלק מן הקבצים יכול להיות תיקיות. קיים סימון של המערכת ל"שיוך" של קובץ לתיקייה: הסימן \ במערכת Windows והסימן / במערכת.Linux לדוגמא נמצאת בתיקייה lib1 התיקייה lib2 C, נמצא ברמה העליונה של דיסק פירושו שהתיקייה lib1 c:\lib1\lib2\myfile.txt והקובץ myfile.txt נמצא בתיקייה.lib2 path הוא ה"מסלול" שמוביל מהרמה העליונה של אמצעי האכסון לתיקייה שבה נמצא קובץ, במקרה שלמעלה c:\lib1\lib2 שם מלא של קובץ כולל גם את השם וגם את ה- path, כלומר c:\lib1\lib2\myfile.txt פקודות מערכת לטיפול בקבצים לרשימה המלאה של פקודות לטיפול בקבצים, יש לחפש files בתיעוד. להלן כמה פקודות שימושיות. הארגומנטים של קלט ו/או פלט בכל הפקודות הבאות הם מחרוזות תוים )שמות של קבצים(: ה- path המלא לתיקייה בה נמצאים. מעבר לתיקייה.mydir אם אין path מלא, מטלב מחפש את mydir תחת התיקייה הקיימת. מחיקת קובץ myfile העתקת קובץ ffrom לקובץ fto בניית שם מלא של קובץ מחלקיו, תוך הכנסת סימן התיקייה המתאים למערכת pwd cd mydir delete myfile copyfile ffrom fto fullfile fdir fname fullfile data-files pictures pic1.png ans = data-files\pictures\pic1.png,windows( Linux וכו'(. לדוגמא: בחירת קובץ מתוך רשימה הפקודות הבאות מציגות למשתמש רשימה של קבצים לפי קריטריון מסוים,)pattern( ועוצרות את התוכנית עד שהמשתמש בוחר באמצעות העכבר את אחד הקבצים. המשתמש יכול לעבור לתיקיות אחרות, גם כאלה שנמצאות מעל לתיקייה הנוכחית. מתקבל שם-קובץ )אותו אפשר לשמור במשתנה מחרוזת(. בחירת קובץ לקריאה: יש לבחור שם קובץ קיים. בחירת קובץ לשמירה: ניתן לבחור שם קיים או להזין שם שאינו קיים. [FName,PName] = uigetfile(pattern,title) [FName,PName] = uiputfile(pattern,title) עמ' 1 מתוך 6
בחירת תיקייה: בכל הפקודות האלה: (. path שם קובץ )ללא FName שם של תיקייה, בצורת path מלא. Pname = uigetdir(start_path,title) PName pattern תבנית לבחירה, בדרך כלל בשילוב * המסמן תווים כלשהם. כדי לאפשר בחירת קובץ כלשהו, יש לציין *.* title כותרת, טקסט על פס-הכותרת של חלונית הבחירה. ניתן להשמיט title ואז תופיע כותרת ברירת-מחדל. ניתן להשמיט Pname מהפלט ואז ידוע רק שם הקובץ שנבחר )לא מומלץ, מאחר שאין לצפות את תגובת המשתמש(. דוגמא 1: בניית שם מלא לקובץ לפי בחירת המשתמש. המשתמש מתבקש לזהות את התיקייה ממנה יילקח הקובץ. התוצאה היא מחרוזת תווים. בניית תבנית כך שיוצגו לבחירה הקבצים בתיקייה שנבחרה קודם. המשתמש מתבקש לבחור קובץ מתוך הרשימה שמוצגת. בניית המסלול המלא לקובץ שנבחר. פורמט פונקציה לעומת פורמט פקודה במטלב אפשר לכתוב פקודות בשתי צורות: פורמט פקודה msg = 'directory of.jpg files'; mydir = uigetdir('.',msg) mydir = D:\mbooks\course\phys\shapes ptr = fullfile(mydir,'*.jpg') ptr = D:\mbooks\course\phys\shapes\*.jpg msg = 'select picture'; [File,Path] = uigetfile(ptr,msg) File = rectangle3.jpg Path = D:\mbooks\course\phys\shapes\ PictureFile = fullfile(path,file) PictureFile = D:\mbooks\course\phys\shapes\rectangle3.JPG command arg1 arg2 פורמט פונקציה command(arg1,arg2) הארגומנטים מפוענחים כטקסט לא מתקבל פלט שניתן לשמור במשתנה. שמות ספציפיים הם חלק מן הפקודה. מה שלא מוגדר בין גרשיים, מפוענח כקלט רגיל: אותיות כשמות משתנים, מספרים כמספרים. פלט יתקבל לפי הגדרת הפקודה. מאפשר גמישות כאשר שמות ניתנים ע"י משתני מחרוזת. save results.txt alltab - ascii תמיד יווצר קובץ בשם results.txt save(myfile,'alltab','-ascii') המשתנה alltab ייכתב לקובץ ששמו הוא המחרוזת במשתנה.myfile load acid.txt תמיד יווצר משתנה בשם acid.txt spectra = load(myfile) ייקרא תוכנו של הקובץ ששמו הוא המחרוזת שבמשתנה.myfile אחרי הקריאה הנתונים נשמרים במשתנה.spectra print(myplot,'-dpdf') הפלוט יישמר בפורמט PDF בקובץ ששמו הוא המחרוזת שבמשתנה.myplot תמיד יווצר קובץ בשם print myplot.pdf -dpdf.myplot.pdf עמ' 2 מתוך 6
פורמט פקודה cd mydir מעבר לתיקייה.mydir copyfile a.txt b.txt תמיד יועתק קובץ a.txt לקובץ.b.txt פורמט פונקציה cd(mydir) מעבר לתיקייה ששמה הוא המחרוזת שבמשתנה.mydir copyfile(file_a,file_b) הקובץ ששמו הוא המחרוזת במשתנה file_a יועתק לקובץ ששמו הוא המחרוזת במשתנה.file_b דוגמא 2: הסקריפט d11rotation מבצע את הדברים הבאים: א. נותן למשתמש לבחור קובץ מתוך רשימת קבצי rotation בתיקייה IMG*.csv ב. קורא את הקובץ, ומשרטט את קואורדינטות הגולה ואת הזווית עם ציר x כפונקציה של הזמן. ג. מחשב את זמן המחזור והרדיוס של הסיבוב, ואת השגיאות שלהם. ד. כותב ככותרת לגרף את שם הקובץ ואת התדירות והרדיוס שחושבו. ה. שומר את הציור לקובץ,PDF כאשר שם הקובץ זהה לשם קובץ הנתונים. קלט/פלט מקבצים קבצי טקסט פקודות load ו- save קוראות וכותבות מידע נומרי לקבצי-טקסט, כאשר סיומת הקובץ היא כל דבר למעט.mat nums = load('myfile.txt') פורמט פונקציה כאשר שם הקובץ נתון. המספרים הנקראים מתוך הקובץ MyFile.txt ייכנסו למשתנה.nums nums = load(varfilename) פורמט פונקציה כאשר שם הקובץ הוא מחרוזת תווים שנמצאת במשתנה.VarFileName פורמט פונקציה כאשר שם הקובץ נתון. מספרים במשתנה save('myfile.txt','var1','-ascii').'myfile.txt' ייכתב לקובץ טקסטואלי var1 save(varfilename,'var1','-ascii') פורמט פונקציה כאשר שם הקובץ הוא מחרוזת תווים שנמצאת במשתנה.VarFileName קבצי אקסל קבלת מידע על קובץ status = xlsfinfo(filename) אם FileName הוא בפורמט שניתן לקרוא ע"י xlsread אז מוחזרת מחרוזת התווים Spreadsheet''.Microsoft Excel אם לא, מוחזרת מחרוזת ריקה. מוחזר גם מערך תאים של שמות הגיליונות בקובץ. xlsfinfo(filename) [status,sheets] = עמ' 3 מתוך 6
דוגמא: קריאה כל מה שמזוהה כמספרים בגיליון הפעיל בקובץ אשר שמו במשתנה FileName נקרא לתוך משתנה.nums כל מה שמזוהה כמספרים בגיליון אשר שמו במשתנה [status,sheets] = xlsfinfo('births.xls') status = 'Microsoft Excel Spreadsheet' sheets = {'H1060907152810'} nums = xlsread(filename) SheetName בקובץ אשר שמו במשתנה FileName נקרא לתוך משתנה.nums מספרים בגיליון הפעיל בתחום rng בקובץ אשר שמו במשתנה FileName נקראים לתוך משתנה.nums התחום rng מציין את התא הראשון )שמאלי למעלה( והאחרון )ימני למטה( של מלבן התאים. לדוגמא: לציון עמודות שלמות: מספרים בגיליון אשר שמו במשתנה SheetName בתחום rng בקובץ אשר שמו במשתנה FileName נקראים לתוך משתנה.nums אם מצוין גם גיליון וגם תחום, מספיק לציין את התא הראשון )שמאלי למעלה(. כתיבה האיברים של המשתנה Var נכתבים, כל איבר בתא, בגיליון הפעיל בקובץ אשר שמו במשתנה.FileName האיברים נכתבים לגיליון אשר שמו במשתנה nums = xlsread(filename,sheetname) nums = xlsread(filename,rng) 'A2:B300' 'A:B' nums = xlsread(filename,sheetname,rng) xlswrite(filename,var) xlswrite(filename,numvar,sheetname).filename בקובץ אשר שמו במשתנה SheetName האיברים נכתבים לתחום rng בגיליון הפעיל בקובץ אשר שמו במשתנה.FileName האיברים נכתבים לתחום rng בגיליון אשר שמו במשתנה SheetName בקובץ אשר שמו במשתנה.FileName קלט מן המשתמש קלט מן המקלדת xlswrite(filename,numvar,rng) xlswrite(filename,numvar,sheetname,rng) פקודת input מציגה מחרוזת תווים,prompt עוצרת את ביצוע התכנית ומאפשרת למשתמש להקיש על המקלדת. לאחר שהמשתמש מקיש על,<ENTER> כל מה שהוקש מהצגת ה- prompt ועד מקש זה, מתקבל כפלט של הפקודה. קיימות שתי צורות לפקודה: קלט מפוענח: מטלב מנסה לפענח את התווים שהוקשו כאילו הוקלדו בחלון הפקודות, והתוצאה נשמרת במשתנה.resp קלט גולמי: התווים מועברים למשתנה raw כפי שהוקשו. resp = input(prompt) raw = input(prompt.'s') עמ' 4 מתוך 6
קלט מחלונית טקסט פתיחת חלונית ובה מספר תיבות להכנסת טקסט + כפתורי אישור וביטול. מעל כל תיבת-טקסט יש כותרת.)prompt( לאחר שהמשתמש לוחץ על אחד הכפתורים, החלון נסגר והקלט עובר לסביבה הקוראת כמערך תאים שבו כל תא הוא הטקסט שהוזן בכל תיבה )אם נלחץ אישור( או כמערך תאים ריק )אם נלחץ ביטול(, והתוכנית ממשיכה להתבצע. inputs = inputdlg(prompts) inputdlg({'no. of curves' 'output file'}) ans = '10' 'example' עבור כל תא ב- prompt תיווצר תיבה להכנסת טקסט. דוגמא: ציון כותרת לחלון הממשק + מספר השורות לכל קלט inputdlg(prompts,title,nlines) inputs = inputs=inputdlg(prompts,title,nlines,defaults) ציון ערכי ברירת-מחדל. Pstr = {'number of curves' 'full name'}; N = [1 ; 2]; defts = {'1' 'first-name family-name'}; inputs = inputdlg(pstr,'',n,defts) inputs = '3' [2x5 char] inputs{2} ans = Dan Cohen כל ערך ברירת מחדל חייב להיות מחרוזת. דוגמא: אם הקלט הוא יותר משורה אחת, נוצרת מטריצה של תווים ברוחב של השורה הארוכה ביותר. קלט גרפי פקודת ginput עוצרת את ביצוע התכנית ומאפשרת למשתמש להקיש על כפתור שמאלי של העכבר כאשר הוא נמצא על חלון גרפי. [x,y] = ginput(npoints) התוכנית תחכה עד שהמשתמש יכניס Npoints נקודות. קואורדינטות הנקודות מוחזרות בשני מערכים x,y כל אחד באורך של מספר הנקודות שהוכנסו. xy = ginput(npoints) קואורדינטות הנקודות מוחזרות במערך אחד xy אשר מספר השורות בו כמספר הנקודות שהוכנסו. [x,y] = ginput התוכנית תחכה עד שהמשתמש מקיש על <ENTER> דוגמא 3: הסקריפט d11solve משתמש בפונקציה d8maxiter לפתרון משוואת ון דר ולס. מהלך הסקריפט: א. ב. ג. ד. ה. ו. מקבל מן המשתמש בחלונית טקסט את הפרמטרים p0,t ומידת הדיוק. מחשב ומציג גרפית את המשוואה. מבקש מן המשתמש לציין על הגרף את התחום לחיפוש פתרון. מפעיל את d8maxiter עם כל הפרמטרים שנקלטו מן המשתמש. אם לא התקבל פתרון, מבקש שוב את התחום. כאשר מתקבל פתרון: 1. מציג אותו על הגרף 2. מבקש מן המשתמש טקסט לכותרת ומוסיף כותרת. עמ' 5 מתוך 6
d11solve title for plot: gas pressure בחירה מתוך רשימה פתיחת חלונית ובה רשימת פריטים לבחירה + כפתורי אישור וביטול. ניתן לבחור פריט אחד או יותר )לפי ההגדרה(. לאחר שהמשתמש לוחץ על אחד הכפתורים, החלונית נסגרת והקלט עובר לסביבה הקוראת כמערך של האינדקסים של הפריטים שנבחרו )אם נלחץ אישור( או כמערך תאים ריק )אם נלחץ ביטול(, והתוכנית ממשיכה להתבצע. בנוסף ניתן להחזיר גם משתנה לוגי שמציין האם בוצעה בחירה )אמת( או ביטול )שקר(. הארגומנטים לפקודנה ניתנים בזוגות: listdlg(name1,value1,name2,value2 ) [indx,ok] = בכל זוג המילה הראשונה היא מחרוזת שמציינת את שם התכונה, והשניה מציינת את הערך. לדוגמא, רשימת הערכים 'ListString',{'Me' 'You' 'Him' 'Her'} לבחירה חייבת להופיע, כמערך-תאים: 'SelectionMode','single' אופן הבחירה )יחיד או מרובה. מרובה ברירת מחדל(: 'PromptString','Choose only one:' כותרת מעל רשימת הערכים: דוגמא 4: בהמשך לדוגמא 6 בשיעור 9 ה, סקריפט d11gas מקבל מן המשתמש כקלט את הטמפרטורה ומשתמש בפונקציה d9pressure לחשב את הלחץ. בנוסף, המשתמש בוחר מתוך רשימה את הצבע שבו יוצג שטח האינטגרל שערכו מתאפס עבור הערך המבוקש של הלחץ. עמ' 6 מתוך 6