12a קלט פלט קבצים

9
1 שיעור שניים- עשר: קלט\ פלט קבציםhttp://online.shenkar.ac.il/moodle http://online.shenkar.ac.il/moodle קורס מבוא למדעי המחשב קורס מבוא למדעי המחשב סמסטר א סמסטר א' ' תשס תשס" ח עבודה בסיסית עם קבצים עבודה בסיסית עם קבצים במקרים רבים נירצה לקרוא במקרים רבים נירצה לקרוא/ לכתוב לכתוב קבצים קבצים, , ולא רק לקרוא ולא רק לקרוא מהמקלדת ולכתוב למסך מהמקלדת ולכתוב למסך. לצורך עבודה נוחה עם קבצים לצורך עבודה נוחה עם קבצים) בדומה לקלט בדומה לקלט/ פלט רגיל פלט רגיל( ( יש בספריה יש בספריהstdio.h stdio.h מבנה בשם מבנה בשםFILE FILE , , ופונקציות ופונקציות קלט קלט/ פלט שעובדות איתו פלט שעובדות איתו. נתאר את אופן העבודה הזה נתאר את אופן העבודה הזה.

Upload: yosef-joron

Post on 28-Mar-2016

213 views

Category:

Documents


0 download

DESCRIPTION

C LAN, C LANG

TRANSCRIPT

Page 1: 12A קלט פלט קבצים

1

: עשר-שיעור שניים

פלט קבצים\קלט

http://online.shenkar.ac.il/moodlehttp://online.shenkar.ac.il/moodle

קורס מבוא למדעי המחשבקורס מבוא למדעי המחשב

חח""תשסתשס' ' סמסטר אסמסטר א

עבודה בסיסית עם קבציםעבודה בסיסית עם קבצים

ולא רק לקרוא ולא רק לקרוא , , קבציםקבציםלכתוב לכתוב //במקרים רבים נירצה לקרואבמקרים רבים נירצה לקרוא••

..מהמקלדת ולכתוב למסךמהמקלדת ולכתוב למסך

) ) פלט רגילפלט רגיל//בדומה לקלטבדומה לקלט((לצורך עבודה נוחה עם קבצים לצורך עבודה נוחה עם קבצים ••

ופונקציות ופונקציות , , FILEFILE מבנה בשםמבנה בשם stdio.hstdio.hיש בספריה יש בספריה

..פלט שעובדות איתופלט שעובדות איתו//קלטקלט

..נתאר את אופן העבודה הזהנתאר את אופן העבודה הזה••

Page 2: 12A קלט פלט קבצים

2

פתיחת הקובץפתיחת הקובץ: : תחילת העבודה עם קובץתחילת העבודה עם קובץ

בעזרת בעזרת לפתוח אותולפתוח אותוצריך קודם כל צריך קודם כל , , כדי לעבוד עם קובץכדי לעבוד עם קובץ••;fopen(fopen("info.txt""info.txt", , "r""r");): : למשללמשל. . fopenfopenהפונקציה הפונקציה

••fopenfopen סוג העבודה איתוסוג העבודה איתוואת ואת , , שם הקובץשם הקובץמקבלת את מקבלת את::

..""ww""––כתיבה כתיבה , , ""aa""––הוספה הוספה , , ""rr""––קריאה קריאה אם רוצים אם רוצים . . את תוכנו הקודםאת תוכנו הקודם מוחקתמוחקת ""ww")")((פתיחת קובץ קיים לכתיבה פתיחת קובץ קיים לכתיבה ••

.. (" ("aa")")לשמור את התוכן הקיים נשתמש בהוספהלשמור את התוכן הקיים נשתמש בהוספה

. . FILEFILEהפונקציה הזאת מחזירה מצביע למשתנה מסוג הפונקציה הזאת מחזירה מצביע למשתנה מסוג ••

::לדוגמאלדוגמא

FILE* fp;FILE* fp;

fp =fp = fopen("info.txt", "fopen("info.txt", "rr");");

המשךהמשך --פתיחת הקובץ פתיחת הקובץ

יוחזר יוחזר ––אבל הוא לא קיים אבל הוא לא קיים לקריאהלקריאהאם ניסינו לפתוח קובץ אם ניסינו לפתוח קובץ ••

NULLNULL..

––אבל הוא לא קיים אבל הוא לא קיים לכתיבה או הוספהלכתיבה או הוספהאם ניסינו לפתוח קובץ אם ניסינו לפתוח קובץ ••

למשל למשל (( לא יצליחלא יצליחאם הוא אם הוא . . כזהכזה קובץ חדשקובץ חדשהמחשב ינסה ליצור המחשב ינסה ליצור

..NULLNULLיוחזר יוחזר ––) ) אם אין מקום בדיסקאם אין מקום בדיסק

Page 3: 12A קלט פלט קבצים

3

וידואוידוא --פתיחת קובץ פתיחת קובץ

. . לכן לאחר פתיחת קובץ יש לוודא שהפתיחה הצליחהלכן לאחר פתיחת קובץ יש לוודא שהפתיחה הצליחה••

::למשללמשל

FILE* fp;FILE* fp;

fp =fp = fopen("in.txt", "r");fopen("in.txt", "r");

if (fp == NULL)if (fp == NULL)

printf("The file could not be openedprintf("The file could not be opened\\n");n");

סגירת קובץסגירת קובץ

::עד סוף התוכנית יש לסגור כל קובץ שפתחנועד סוף התוכנית יש לסגור כל קובץ שפתחנו••

FILE* fp;FILE* fp;

fp =fp = fopen("in.txt", "r");fopen("in.txt", "r");

….….

fclosefclose((fp);fp);

עם מצביע עם מצביע fclosefcloseי קריאה לפונקציה י קריאה לפונקציה ""הסגירה תתבצע עהסגירה תתבצע ע ..שפתחנושפתחנו) ) FILEFILEלמבנה למבנה ((לקובץ לקובץ

Page 4: 12A קלט פלט קבצים

4

קריאה מקובץ קריאה מקובץ

..ניתן לקרוא מקובץ רק אם פתחנו אותו לקריאהניתן לקרוא מקובץ רק אם פתחנו אותו לקריאה••

, , scanfscanfשפועלת כמו שפועלת כמו , , fscanffscanfי י ""נוכל לבצע את הקריאה ענוכל לבצע את הקריאה ע••

::למשללמשל. . מצביע לקובץמצביע לקובץרק מקבלת כפרמטר ראשון רק מקבלת כפרמטר ראשון

FILE* ifp;FILE* ifp;

ifpifp == fopen("in.txt", "r");fopen("in.txt", "r");

fscanffscanf((ifpifp, "%, "%d %c", &num, &tav);d %c", &num, &tav);

))צריך לוודא שהקובץ נפתחצריך לוודא שהקובץ נפתח((

כך כך , , שומר את המקום שהגענו אליו בקובץשומר את המקום שהגענו אליו בקובץ FILEFILEהמבנה המבנה ••

..שבקריאה הבאה נמשיך משםשבקריאה הבאה נמשיך משם

..מחזירה את מספר המשתנים שהיא קראהמחזירה את מספר המשתנים שהיא קראה fscanffscanfהפונקציה הפונקציה ••

פונקציות נוספותפונקציות נוספות––קריאה מקובץ קריאה מקובץ

::י הפונקציהי הפונקציה""ניתן לקרוא מחרוזת גם עניתן לקרוא מחרוזת גם ע••

char* fgets(char*char* fgets(char* str, str, intint nn,, FILE* ifp)FILE* ifp);;

עד עד ) ) כוללכולל, , nn\\עד עד ((מלבד זה שנקרא שורה מלבד זה שנקרא שורה , , getsgetsזה פועל כמו זה פועל כמו ••).).כרגיל בקריאת מחרוזתכרגיל בקריאת מחרוזת 00\\בסיום יוכנס בסיום יוכנס (( תוויםתווים nn--11לכל היותר לכל היותר

..מצביע לקובץמצביע לקובץהפרמטר האחרון הוא הפרמטר האחרון הוא ••

).).ואחרת המחרוזת תוחזרואחרת המחרוזת תוחזר(( NULLNULLאם הקובץ הסתיים יוחזר אם הקובץ הסתיים יוחזר ••

..()()getchargetchar--וזה יקביל לשימוש בוזה יקביל לשימוש ב getc(ifp)getc(ifp)--ניתן להשתמש גם בניתן להשתמש גם ב••

..מוחזר התו הבא בקובץמוחזר התו הבא בקובץ

Page 5: 12A קלט פלט קבצים

5

סוף הקובץסוף הקובץ––קריאה מקובץ קריאה מקובץ

--וו getcgetcאז אז , , אם ניסינו לקרוא מקובץ והקובץ הסתייםאם ניסינו לקרוא מקובץ והקובץ הסתיים••fscanffscanf שמשמעותו סוף קובץשמשמעותו סוף קובץ ,,--11יחזירו את הערך יחזירו את הערך..

) ) EOFEOF ))End Of FileEnd Of Fileמוגדר הקבוע מוגדר הקבוע stdio.hstdio.hבספריה בספריה ••..--11שערכו שערכו

נשתמש בקבוע הזה כשנבדוק נשתמש בקבוע הזה כשנבדוק , , התוכניתהתוכנית--לצורך קריאותלצורך קריאות••):):--11במקום לרשום במקום לרשום ((שלא הגענו לסוף שלא הגענו לסוף

if (fscanf("%d",if (fscanf("%d", &i) !=&i) != EOFEOF))

לכתיבהלכתיבה פתיחת קובץפתיחת קובץ

fopen("fopen("in.txtin.txt", "", "ww");");

::לכן נכתובלכן נכתוב, , FILEFILE--הפונקציה מחזירה מצביע להפונקציה מחזירה מצביע ל••

FILE* ofp;FILE* ofp;

ofp =ofp = fopen("in.txt", "w");fopen("in.txt", "w");

Page 6: 12A קלט פלט קבצים

6

כתיבה לקובץכתיבה לקובץ

..ניתן לכתוב לקובץ רק אם פתחנו אותו לכתיבהניתן לכתוב לקובץ רק אם פתחנו אותו לכתיבה••

::יי""הכתיבה תתבצע למשל עהכתיבה תתבצע למשל ע••

fprintffprintf ((ofpofp, "%d, "%d %%c", num,c", num, tav);tav);

מלבד זה שהפרמטר מלבד זה שהפרמטר , , printfprintf--השימוש זהה לשימוש בהשימוש זהה לשימוש ב••

..שאליו נכתובשאליו נכתוב מצביע לקובץמצביע לקובץהראשון הוא הראשון הוא

קבצים מיוחדיםקבצים מיוחדים

אל אל ((והפלט והפלט ) ) מהמקלדתמהמקלדת((מתייחסת גם אל הקלט מתייחסת גם אל הקלט CCשפת שפת ��..כתיבה של קבציםכתיבה של קבצים//כאל קריאהכאל קריאה) ) המסךהמסך

הקבצים עבור הקבצים עבור באופן אוטומטיבאופן אוטומטיבתחילת התוכנית נפתחים בתחילת התוכנית נפתחים ��).).והם נסגרים באופן אוטומטי בסיומהוהם נסגרים באופן אוטומטי בסיומה((זה זה

��stdinstdin – – מהמקלדתמהמקלדת((הקלט הסטנדרטי הקלט הסטנדרטי.(.(

��stdoutstdout – – למסךלמסך((הפלט הסטנדרטי הפלט הסטנדרטי.(.(

��stderrstderr–– מנותב גם הוא למסךמנותב גם הוא למסך((פלט של הודעות שגיאה פלט של הודעות שגיאה.(.(

::היא למעשההיא למעשה ;printf("%d", printf("%d", 1010);)כך למשל הפקודה כך למשל הפקודה ��

fprintffprintf ((stdout,stdout, "%d", "%d", 1010););

Page 7: 12A קלט פלט קבצים

7

שימוששימוש --קבצים מיוחדים קבצים מיוחדים

, , קלט מהמקלדת למחרוזתקלט מהמקלדת למחרוזת--למשל אם רוצים לקרוא שורתלמשל אם רוצים לקרוא שורת

--כולל ירידת השורה והכולל ירידת השורה וה(( 2020--אבל להגביל את מספר התווים לאבל להגביל את מספר התווים ל

--אז אפשר להשתמש באז אפשר להשתמש ב, , ))\\00

fgets(str, fgets(str, 2200, stdin);, stdin);

אז אז , , שורה וזה לא כךשורה וזה לא כך--אם התכוונו שהתו האחרון יהיה ירידתאם התכוונו שהתו האחרון יהיה ירידת((

))נוכל פשוט לבדוק זאת ולתת הודעה שגיאה למשתמשנוכל פשוט לבדוק זאת ולתת הודעה שגיאה למשתמש

::דוגמאדוגמא --עבודה עם קבצים עבודה עם קבצים

..יש בויש בו וסופרת כמה שורותוסופרת כמה שורותנכתוב תוכנית שמקבלת שם של קובץ נכתוב תוכנית שמקבלת שם של קובץ

..לכל היותרלכל היותר 8080נניח שאורך כל שורה ואורך שם הקובץ הוא נניח שאורך כל שורה ואורך שם הקובץ הוא

Page 8: 12A קלט פלט קבצים

8

תוכנית שסופרת שורות בקובץתוכנית שסופרת שורות בקובץ

##define SIZE define SIZE 8181

int main()int main()

{ {

FILE*FILE* ifp;ifp;

int count=int count=00;;

char line[SIZE], filename[SIZE];char line[SIZE], filename[SIZE];

fgets(filename, SIZE,fgets(filename, SIZE, stdin);stdin);

ifp =ifp = fopen(filename, "r");fopen(filename, "r");

קוראים את שם הקובץ קוראים את שם הקובץ

פתיחת הקובץ לקריאהפתיחת הקובץ לקריאה

if (ifp == NULL)if (ifp == NULL)

{{

printf("File could not be openedprintf("File could not be opened\\n");n");

return return --11;;

}}

while(fgets(line, SIZE,while(fgets(line, SIZE, ifp) != NULL)ifp) != NULL)

count++;count++;

printf("There are %d linesprintf("There are %d lines\\n", count);n", count);

fclose(ifp);fclose(ifp);

return return 00;;

}}

בודקים אם הפתיחה הצליחה בודקים אם הפתיחה הצליחה

וסופרים אותן וסופרים אותן , , קוראים שורות כל עוד ישקוראים שורות כל עוד יש

סגירת הקובץ בסיום סגירת הקובץ בסיום

Page 9: 12A קלט פלט קבצים

9

קבצים קבצים --סיכוםסיכום

פלט פלט //פלט עם קבצים בדומה לקלטפלט עם קבצים בדומה לקלט//קלטקלט CC --אפשר לבצע באפשר לבצע ב••

..עם המקלדת והמסךעם המקלדת והמסך

המתאים המתאים modemode --צריך לזכור לפתוח את הקובץ בהתחלה בצריך לזכור לפתוח את הקובץ בהתחלה ב••

..ולסגור אותו בסיום התוכניתולסגור אותו בסיום התוכנית

??שאלות נוספותשאלות נוספות

עשרעשר--שיעור שנייםשיעור שניים––קורס תכנות קורס תכנות