C/C++ מדריכי
C הקדמה לתכנות ב
C++ הקדמה להיררכית מחלקות ב הצגה מזורזת :C++ הבנת דף הבית

שיעור 8: קבצי טקסט ב C

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

כאשר אתה זקוק לקלט/פלט של טקסט בתוכנית C, ואתה צריך רק מקור אחד לאינפורמציית קלט ויעד אחד לאינפורמציית פלט, אתה יכול לסמוך על (standard in) stdin ועל (standard out) stdout . ניתן לאחר מכן להשתמש בהכוונה לקלט ולפלט בשורת הפקודה כדי להעביר זרימות אינפורמציה שונות בתוך התוכנית. ישנן שש פקודות קלט/פלט שונות ב <stdio.h> שניתן להשתמש בהן עם stdin ו stdout:

printf

מדפיסה פלט מפורמט ל stdout

scanf

קוראת קלט מפורמט מ stdin

puts

מדפיסה מחרוזת ל stdout

gets

קוראת מחרוזת מ stdin

putc

מדפיסה תו ל stdout

getc, getchar

קוראות תו מ stdin

היתרון של stdin ו stdout הוא שהם קלים לשימוש. כמו כן, היכולת לכוון מחדש את הקלט/פלט היא בעלת עוצמה רבה. לדוגמא, ייתכן שתרצה ליצור תוכנית שקוראת מ stdin וסופרת את מספר התווים:

#include <stdio.h>  
#include <string.h> 
 
void main()  
{    
    char s[1000];    
    int count=0;     
     while (gets(s))      
        count += strlen(s);    
    printf("%d\n",count);  
}

הדפס קוד זה והרץ אותו. הוא מחכה לקלט מ stdin, לכן הקלד מספר שורות. כאשר סיימת, הקש CTRL-D כדי לסמן את סוף הקובץ gets .(eof) קוראת שורה עד שהיא מבחינה ב eof, אז היא מחזירה 0 כך שלולאת ה while מסתיימת. כאשר תקיש CTRL-D, תראה ספירה של מספר התווים ב stdout (המסך).

כעת, נניח שאתה רוצה לספור את התווים בקובץ. אם הדרת את התוכנית ל a.out, אתה יכול להקיש:

a.out < filename

במקום לקבל קלט מהמקלדת, ייעשה שימוש בתוכן של הקובץ שנקרא filename. אתה יכול להגיע לאותה תוצאה על ידי שימוש ב pipes:

cat < filename | a.out

אתה יכול גם לכוון את הפלט לקובץ:

a.out < filename > out

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

לעיתים, תאלץ להשתמש ישירות בקובץ טקסט. לדוגמא, ייתכן שתצטרך לפתוח שם קובץ מסוים ולקרוא ממנו או לכתוב אליו. ייתכן שתרצה לנהל מספר זרימות של קלט או פלט או ליצור תוכנית כמו עורך טקסט שיכולה לשמור ולשחזר נתונים או קבצי תצורה לפי פקודה.

fopen

פותחת קובץ טקסט

fclose

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

feof

מגלה סימון סוף קובץ בקובץ

fprintf

מדפיסה פלט מפורמט לקובץ

fscanf

קוראת קלט מפורמט מקובץ

fputs

מדפיסה מחרוזת לקובץ

fgets

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

fputc

מדפיסה תו לקובץ

fgetc

קוראת תו מקובץ

משתמשים בפקודה fopen כמו ב reset ו rewrite בפסקל. היא פותחת קובץ למצב מתואר (השלושה הנפוצים ביותר הם r, w, ו a עבור קריאה, כתיבה והוספה). לאחר מכן היא מחזירה מצביע לקובץ שבו משתמשים כדי לגשת לקובץ. לדוגמא, נניח שאתה רוצה לפתוח קובץ ולכתוב את המספרים 1 עד 10 לתוכו. אתה יכול להשתמש בקוד הבא:

#include <stdio.h> 
#define MAX 10 
void main()  
{    
    FILE *f;    
    int x; 
     f=fopen("out","w");    
    for(x=1; x<=MAX; x++)      
        fprintf(f,"%d\n",x); 
    fclose(f); 
}

פקודת ה fopen כאן פותחת קובץ בשם out עם המצב w. זהו מצב כתיבה הרסני, שמשמעותו שאם out לא קיים הוא נוצר, אבל אם הוא קיים הוא נהרס וקובץ חדש נוצר במקומו. פקודת ה fopen מחזירה מצביע לקובץ, שמאוחסן במשתנה f. במשתנה זה משתמשים כדי לפנות לקובץ. אם הקובץ לא יכול להיפתח מאיזושהי סיבה, f יכיל NULL.

הפקודה fprintf צריכה להיראות מוכרת: היא בדיוק כמו printf אבל משתמשת במצביע הקובץ כפרמטר הראשון שלה. הפקודה fclose סוגרת את הקובץ כאשר סיימת. כדי לקרוא קובץ, פתח אותו עם מצב r. באופן כללי, זה לא רעיון טוב להשתמש ב fscanf לקריאה: אלא אם כן הקובץ מפורמט בצורה מושלמת, fscanf לא תטפל בו נכון. במקום זאת, השתמש ב fgets כדי לקרוא כל שורה ואז פצל את החלקים שאתה צריך.

הקוד הבא מדגים את התהליך של קריאת קובץ וזריקת התוכן שלו למסך:

#include <stdio.h> 
 
void main()  
{    
    FILE *f;    
    char s[1000]; 
    
    f=fopen("infile","r");    
    while (fgets(s,1000,f)!=NULL)      
        printf("%s",s);    
    fclose(f);  
} 

פקודת ה fgets מחזירה NULL בסימון סוף הקובץ. היא קוראת שורה (עד 1,000 תווים במקרה זה) ואז מדפיסה אותה ל stdout. שים לב שפקודת printf לא כוללת n\ בתבנית המחרוזת, כיוון ש fgets מוסיפה n\ בסוף כל שורה שהיא קוראת. כך, אתה יכול לדעת אם שורה אינה שלימה במקרה שהיא גולשת מעבר לאורך השורה המקסימלי המתואר בפרמטר השני של fgets.

שגיאות ב C מהן יש להימנע:

1. אל תכתוב בטעות close במקום fclose. פונקצית ה close קיימת, כך שהמהדר מקבל אותה. זה אפילו יראה כאילו זה עובד אם התוכנית רק פותחת או סוגרת מספר קטן של קבצים. אולם, אם התוכנית פותחת וסוגרת קובץ בלולאה, בסופו של דבר יגמרו לה ה file handles ו/או מקום בזיכרון והיא תתרסק בגלל ש close לא סוגר קבצים כראוי.




לדף הראשון

<< לדף הקודם

לדף הבא >>