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

10
1 קלט קלט\ פלט קבצים פלט קבצים העברת פרמטרים לתוכניות ב העברת פרמטרים לתוכניות ב- C קלט ופלט ב קלט ופלט ב- C I/O redirection I/O redirection C העברת פרמטרים לתוכניות ב העברת פרמטרים לתוכניות ב- - כאשר כאשרmain main נקראת מועברים אליה שני פרמטרים נקראת מועברים אליה שני פרמטרים: argc argc - מספר הארגומנטים בשורת הפקודה מספר הארגומנטים בשורת הפקודה) כולל הפקודה כולל הפקודה עצמה עצמה( argv argv - מצביע למערך של מחרוזות אשר מכילות את מצביע למערך של מחרוזות אשר מכילות את הארגומנטים בשורת הפקודה הארגומנטים בשורת הפקודה נכתוב תוכנית בשם נכתוב תוכנית בשםecho echo אשר תדפיס את הארגומנטים בשורת אשר תדפיס את הארגומנטים בשורת הפקודה שלה בשורה אחת עם רווח ביניהם הפקודה שלה בשורה אחת עם רווח ביניהם לדוגמא לדוגמא: > echo hello, world hello, world > הוחלט ש הוחלט שargv[ argv[0] הוא שם התוכנית הנקראת הוא שם התוכנית הנקראת. . לכן לכןargc argc הוא הוא לפחות לפחות1 . . אם אםargc argc הוא הוא1 אין ארגומנטים אחרי שם התוכנית אין ארגומנטים אחרי שם התוכנית. . בדוגמא לעיל בדוגמא לעילargc argc הוא הוא3 ו וargv[ argv[0] , , argv[ argv[1] ו וargv[ argv[2] הם הם"echo" "echo" , , "hello," "hello," ו ו"world" "world" בהתאמה בהתאמה

Upload: yosef-joron

Post on 28-Mar-2016

221 views

Category:

Documents


4 download

DESCRIPTION

C LAN, C LANG

TRANSCRIPT

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

1

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

CC--העברת פרמטרים לתוכניות בהעברת פרמטרים לתוכניות ב��

CC--קלט ופלט בקלט ופלט ב��

��I/O redirectionI/O redirection

CC - - העברת פרמטרים לתוכניות בהעברת פרמטרים לתוכניות ב::נקראת מועברים אליה שני פרמטריםנקראת מועברים אליה שני פרמטרים mainmainכאשר כאשר ��

��argcargc -- כולל הפקודה כולל הפקודה ((מספר הארגומנטים בשורת הפקודה מספר הארגומנטים בשורת הפקודה))עצמהעצמה

��argvargv -- מצביע למערך של מחרוזות אשר מכילות את מצביע למערך של מחרוזות אשר מכילות אתהארגומנטים בשורת הפקודההארגומנטים בשורת הפקודה

אשר תדפיס את הארגומנטים בשורת אשר תדפיס את הארגומנטים בשורת echoechoנכתוב תוכנית בשם נכתוב תוכנית בשם ��הפקודה שלה בשורה אחת עם רווח ביניהםהפקודה שלה בשורה אחת עם רווח ביניהם

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

> echo hello, worldhello, world>

הוא הוא argcargcלכן לכן . . הוא שם התוכנית הנקראתהוא שם התוכנית הנקראת argv[argv[00]]הוחלט ש הוחלט ש ��. . אין ארגומנטים אחרי שם התוכניתאין ארגומנטים אחרי שם התוכנית 11הוא הוא argcargcאם אם . . 11לפחות לפחות

הם הם argv[argv[22]]ו ו argv[argv[00]] , ,argv[argv[11]]ו ו 33הוא הוא argcargcבדוגמא לעיל בדוגמא לעיל "echo""echo" , ,"hello,""hello," ו ו"world""world" בהתאמהבהתאמה

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

2

CC - - העברת פרמטרים לתוכניות בהעברת פרמטרים לתוכניות בוהאחרון יהיה ב והאחרון יהיה ב argv[argv[11]]הארגומט האופציונלי הראשון יהיה ב הארגומט האופציונלי הראשון יהיה ב ��

argv[argcargv[argc--11]] . . בנוסף הסטנדרט קובע ש בנוסף הסטנדרט קובע שargv[argc]argv[argc] יהיה יהיה..מחרוזת ריקהמחרוזת ריקה

::echoechoהתוכנית התוכנית ��

#include#include <<stdio.h>stdio.h>/* /* echo commandecho command--line arguments */line arguments */intint main (int argc, char* argv[])main (int argc, char* argv[]){{

intint i;i;forfor ((i = i = 11; i < argc; i++); i < argc; i++)

printf ("%s ", argv[i]);printf ("%s ", argv[i]);printf ("printf ("\\n");n");returnreturn 00;;

}}

echo\0

hello,\0

World\0

argv

argc=3

NULL

CC --קלט פלט בקלט פלט ב

כלומר צריך לבצע כלומר צריך לבצע , , stdio.hstdio.hפלט נמצאות בספריה פלט נמצאות בספריה //פונקציות קלטפונקציות קלט��

#include#include <stdio.h><stdio.h>

פלט לקבציםפלט לקבצים//פלט למסך וקלטפלט למסך וקלט, , ניתן בעזרתן לבצע קלט מהמקלדתניתן בעזרתן לבצע קלט מהמקלדת

::כדי להשתמש בקובץ יש צורךכדי להשתמש בקובץ יש צורך��

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

לכתוב אל הקובץלכתוב אל הקובץ//לקרואלקרוא..22

לסגור את הקובץלסגור את הקובץ..33

--FILEFILEי משתנה מטיפוס מצביע לי משתנה מטיפוס מצביע ל""כל הפעולות על קבצים נעשות עכל הפעולות על קבצים נעשות ע��))stdio.hstdio.hמוגדר ב מוגדר ב FILEFILEהטיפוס הטיפוס ((

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

FILE* fd;FILE* fd; /* /* file descriptor */file descriptor */

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

3

פתיחה של קובץפתיחה של קובץ::fopenfopen' ' י הפונקי הפונק""פתיחת קובץ נעשית עפתיחת קובץ נעשית ע��

FILE* fopen(const char* filename,const char* mode);FILE* fopen(const char* filename,const char* mode);��filenamefilename - - שם הקובץ לפתיחהשם הקובץ לפתיחה

��modemode -- המצב בו יש לפתוח את הקובץהמצב בו יש לפתוח את הקובץ::

"r""r" -- פתח לקריאה בלבדפתח לקריאה בלבד

"w""w" -- פתח לכתיבה בלבדפתח לכתיבה בלבד

"a""a" - - פתח לכתיבה בסוף הקובץפתח לכתיבה בסוף הקובץ

הפונקציה מחזירה מצביע לערוץ הפתוח אם הצליחה לפותחו הפונקציה מחזירה מצביע לערוץ הפתוח אם הצליחה לפותחו ��NULLNULLואחרת מחזירה ואחרת מחזירה

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

FILE* fd;FILE* fd;fd =fd = fopen("hello.c" , "r");fopen("hello.c" , "r");

אזי הוא נוצר אזי הוא נוצר , , אם פותחים קובץ לכתיבה והקובץ לא קיים עדייןאם פותחים קובץ לכתיבה והקובץ לא קיים עדיין��פתיחה לקריאה של קובץ שאינו פתיחה לקריאה של קובץ שאינו . . fopenfopenבעקבות הקריאה לפונקציה בעקבות הקריאה לפונקציה

..קיים גורמת לשגיאהקיים גורמת לשגיאה

סגירה של קובץסגירה של קובץ::fclosefclose' ' י הפונקי הפונק""נעשית ענעשית ע fopenfopenי י ""סגירת קובץ שנפתח עסגירת קובץ שנפתח ע��

int fclose (FILE* fd);int fclose (FILE* fd);��fclose fclose אם הצליחה ו אם הצליחה ו 00מחזירה מחזירהEOFEOF אם קרתה שגיאהאם קרתה שגיאה..

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

FILE* fd;fd = fopen("hello.c" , "r");/* Perform input/output on file */if (fclose(fd) == EOF)

printf ("Could not close file!\n");else printf ("File closed successfuly.\n");

בסיום ריצת תוכנית מערכת ההפעלה דואגת לסגור את כל הקבציםבסיום ריצת תוכנית מערכת ההפעלה דואגת לסגור את כל הקבצים��

זמנית עבור זמנית עבור - - קיימת מגבלה על מספר הקבצים הפתוחים בוקיימת מגבלה על מספר הקבצים הפתוחים בו��..תוכנית מסויימתתוכנית מסויימת

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

4

ערוצים סטנדרטייםערוצים סטנדרטייםגם הקלט . יש התייחסות אחידה לכל סוגי הקלט והפלט -Cב�

FILEי ערוצים ומצביעים ל "מהמקלדת והפלט מהמסך נעשים ע

מתחילה לרוץ מערכת ההפעלה פותחת עבורה Cכאשר תוכנית �:בצורה אוטומטית שלושה ערוצים סטנדרטיים

11..stdinstdin כ מהמקלדת"בד(נפתח לקריאה(

22..stdoutstdout כ אל המסך"בד(נפתח לכתיבה(

33..stderrstderr כ אל המסך"בד(נפתח לכתיבה (

�stdin ,stdout וstderr הם למעשה שמות משתנים כאשר כולם.FILEמטיפוס מצביעים ל

:לדוגמא הפקודה�

fclose (stdin);fclose (stdin);תגרום לכך שלא ניתן יותר לקרוא קלט מהמקלדת

EOFאם תוכנית קוראת נתונים מהמקלדת ורוצים להקליד תו :הערהCtrl-dיש להקיש

ערוצים סטנדרטייםערוצים סטנדרטיים copycopyהתוכנית התוכנית ::דוגמאדוגמא��

מעתיקה את הקובץ אשר שמו הנו מעתיקה את הקובץ אשר שמו הנו , , במידה וקבלה שני פרמטריםבמידה וקבלה שני פרמטרים��לקובץ אשר שמו הנו הפרמטר השנילקובץ אשר שמו הנו הפרמטר השני, , הפרמטר הראשוןהפרמטר הראשון

מעתיקה את הקובץ אשר שמו הנו מעתיקה את הקובץ אשר שמו הנו , , במידה וקיבלה פרמטר יחידבמידה וקיבלה פרמטר יחיד��פרמטר זה לערוץ הפלט הסטנדרטיפרמטר זה לערוץ הפלט הסטנדרטי

התוכנית מעתיקה את מה התוכנית מעתיקה את מה , , במידה ולא התקבלו שמות קבצים כללבמידה ולא התקבלו שמות קבצים כלל��שמתקבל בערוץ הקלט הסטנדרטי לערוץ הפלט הסטנדרטישמתקבל בערוץ הקלט הסטנדרטי לערוץ הפלט הסטנדרטי

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

5

ערוצים סטנדרטייםערוצים סטנדרטיים#include <stdio.h>#define CHUNK_LEN 100void error(char *msg) {

fprintf(stderr, "Error: %s\n", msg);exit(1);

}int main(int argc, char *argv[]) {

FILE *in = stdin;FILE *out = stdout;char buf[CHUNK_LEN];if (argc>3) error("Bad Number of parameters");if (argc>1){

in = fopen(argv[1], "r");if (in==NULL) error("Can't open input file");

}if (argc>2) {

out = fopen(argv[2], "w");if (out==NULL) error("Can't open output file");

}while(fgets(buf, CHUNK_LEN, in) != NULL)

fputs(buf, out);fclose(in);fclose(out);return 0;

}

ערוצים סטנדרטייםערוצים סטנדרטיים

char* fgets (char* line, int maxline, FILE *fp)char* fgets (char* line, int maxline, FILE *fp)לכל היותר . lineלתוך fpמקובץ , ’n\'כולל , קוראת שורה�

maxline-1 תווים יקראו

lineאחרת מחזירה , error-בסוף קובץ וב NULLמחזירה �

int fputs(char*int fputs(char* line, FILE *fp)line, FILE *fp)לקובץ lineכותבת את �

אפס אחרת, אם יש שגיאה EOFמחזירה �

char* gets(char*char* gets(char* s)s)רק מהקלט הסטנדרטי fgets-בדומה ל�

’0\‘-ב ’n\'מחליף �

int puts(char* s)int puts(char* s)רק אל הפלט הסטנדרטי fputs-בדומה ל�

’n\'מוסיף �

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

6

I/O redirectionI/O redirection

ערוץ הקלט הסטנדרטי מחובר אל ערוץ הקלט הסטנדרטי מחובר אל UnixUnixבכל תוכנית שרצה תחת בכל תוכנית שרצה תחת ��

וערוצי הפלט והודעות השגיאה הסטנדרטיים מחוברים וערוצי הפלט והודעות השגיאה הסטנדרטיים מחוברים , , המקלדתהמקלדת

אל המסך כברירת מחדלאל המסך כברירת מחדל

ניתן לכוון מחדש הן את ערוץ הקלט הסטנדרטי והן את ניתן לכוון מחדש הן את ערוץ הקלט הסטנדרטי והן את CShellCShellב ב ��

. . ערוצי הפלט והשגיאות הסטנדרטיים אל ומאת קבצים כלשהםערוצי הפלט והשגיאות הסטנדרטיים אל ומאת קבצים כלשהם

redirectionredirectionהכיוון מחדש נקרא הכיוון מחדש נקרא

stdout

stdin

stderr

Program

Input redirectionInput redirection

<program> < < <filename>

לקבל את הקלט הסטנדרטי שלה מהקובץ program -תגרום ל�filename

:לדוגמא�

% % copy < filenamecopy < filename

filenameהנתונה לקחת את הקלט מהקובץ copy-תגרום ל�

עבור התוכנית ) מבחינת התוצאה(ל שקולה "ההפעלה בצורה הנ�copy להפעלה:

% % copy filenamecopy filename

?אך מה ההבדל מבחינת התוכנית�

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

7

Output redirectionOutput redirection

<program> > > <filename>לכתוב את הפלט הסטנדרטי שלה לקובץ program -תגרום ל�

filename . אם קיים כבר קובץ בשםfilename לפני ביצועהפקודה לא תבוצע, הפקודה

% % cat myfilecat myfile

line line 11

line line 22

% % cat myfile > outcat myfile > out

% % cat outcat out

line line 11

line line 22

%%

Output redirectionOutput redirection

<program> >> >> <filename>אך filenameלקובץ programמכוונת את הפלט הסטנדרטי של �

filenameאם לא קיים קובץ בשם . משרשרת אותו לסוף הקובץהפקודה לא תבוצע, לפני ביצוע הפקודה

% % cat yourfilecat yourfile

line line 33

% % cat yourfile >> outcat yourfile >> out

% % cat outcat out

line line 11

line line 22

line line 33

%%

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

8

Output redirectionOutput redirection

) <(הראשונה . ראינו ששתי פקודות כיוון הפלט הקודמות עלולות להיכשל�אם הקובץ אינו קיים) <<(והשנייה , אם הקובץ קיים

לפקודות ! י הוספת "ל יצליחו בכל מקרה ע"ניתן להבטיח שהפקודות הנ�:הכיוון

<program> >! >! <filename>וכותבת עליו את הפלט הסטנדרטי של filenameהורסת את הקובץ �

program בכל מקרה

<אזי מתקבלת אותה התנהגות כשל , אינו קיים filenameאם הקובץ �

<program> >>!>>! <filename>>

.אם הוא לא קיים filenameיוצרת את הקובץ �

<<אזי מתקבלת אותה התנהגות כשל , קיים filenameאם הקובץ �

Input and output redirectionInput and output redirection

ניתן להפנות גם את ערוץ הקלט הסטנדרטי של התוכנית וגם את ניתן להפנות גם את ערוץ הקלט הסטנדרטי של התוכנית וגם את ��ערוץ הפלטערוץ הפלט

::לדוגמא הפקודותלדוגמא הפקודות��

% % cat < in > out cat < in > out

% % cat < in >! outcat < in >! out

))? ? מה ההבדלמה ההבדל(( outoutלקובץ לקובץ ininגורמת להעתקת קובץ גורמת להעתקת קובץ

% % cat < in >> out cat < in >> out

% % cat < in >>! out cat < in >>! out

))??מה ההבדלמה ההבדל(( outoutלסוף קובץ לסוף קובץ ininגורמת להוספת קובץ גורמת להוספת קובץ

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

9

Multiple redirectionMultiple redirectionפלט סטנדרטיים ניתן להפנות גם את ערוץ /בנוסף להפנית קלט�

השגיאות הסטנדרטי מהמסך אל קבצים

<<command> >& <file>command> >& <file>מפנה הן את הפלט הסטנדרטי והן את ערוץ השגיאות הסטנדרטי �

fileלקובץ

% % gcc try_input.c gcc try_input.c --o try_input > out_erro try_input > out_err

try_input.c: In function `main':try_input.c: In function `main':try_input.c:try_input.c:44: parse error before `printf': parse error before `printf'*** *** Error code Error code 11% % more out_errmore out_err

% % gcc try_input.c gcc try_input.c --o try_input >& out_erro try_input >& out_err

% % more out_err more out_err

try_input.c: In function `main':try_input.c: In function `main':try_input.c:try_input.c:44: parse error before `printf': parse error before `printf'*** *** Error code Error code 11

הדבר יכול להיות שימושי כאשר נרצה לראות את השגיאות �הראשונות שהקומפילר מוציא

Multiple redirectionMultiple redirection

<command> >&! >&! <file>קיים קיים filefileזהה לפקודה הקודמת אבל עובדת גם אם הקובץ זהה לפקודה הקודמת אבל עובדת גם אם הקובץ ��

<command> >>& >>& <file>אבל כאן המידע החדש משורשר אל אבל כאן המידע החדש משורשר אל , , פועלת כמו במקרה הקודםפועלת כמו במקרה הקודם��

אם רוצים להבטיח כי הפקודה אם רוצים להבטיח כי הפקודה ! ! --ניתן גם להיעזר בניתן גם להיעזר ב. . סוף הקובץסוף הקובץתתבצעתתבצע

<command> >>&!>>&! <file>הפקודההפקודה��

(<command> > > <f1>) >& >& <f2>ואילו להודעות ואילו להודעות ff11גורמת לפלט הסטנדרטי להכתב אל הקובץ גורמת לפלט הסטנדרטי להכתב אל הקובץ ��

ff22השגיאה להכתב אל קובץ השגיאה להכתב אל קובץ

Page 10: 12B קלט פלט קבצים

10

Multiple redirectionMultiple redirection#include#include <<stdio.h>stdio.h>intint main()main() {{

fprintf(stderr,fprintf(stderr, "This is error"This is error\\n");n");printf("This is stdoutprintf("This is stdout\\n");n");returnreturn 00;;

}}

> > gcc prog.c gcc prog.c ––o progo prog

> prog> prog

This is errorThis is errorThis is stdoutThis is stdout> > prog > out.txtprog > out.txt

This is errorThis is error> cat out.txt> cat out.txt

This is stdoutThis is stdout> > prog >& errout.txtprog >& errout.txt

> cat errout.txt> cat errout.txt

This is errorThis is errorThis is stdoutThis is stdout> (> (prog > out) >& errprog > out) >& err

> cat out> cat out

This is stdoutThis is stdout> cat err> cat err

This is errorThis is error