יום רביעי, 1 בפברואר 2017

שפת C - טיפול בקבצים

טיפול בקבצים


- תוכנית יכולה לגשת לקבצים אחרים במחשב. לקרוא, ליצור או לשנות אותם.
- כל הפונקציות והקבועים הנוגעים לטיפול בקבצים כלולים בספריית הקלט פלט, הלא היא ספריית stdio.h .
- כל קובץ הוא מבחינתנו struct מסוג FILE (חשוב להקפיד על האותיות הגדולות). לא נפרט מהם שדותיו.


כדי לטפל או ליצור קובץ נצטרך קודם להצביע על הכתובת שלו בזיכרון. כמו כל המצביעים גם המצביע הזה
צריך להיות מאותו הסוג של הקובץ עליו הוא אמור להצביע, היינו מסוג FILE.
(ולא מסוג  "struct FILE", משום ש"FILE" הוא טיפוס שהוגדר כבר  כ "struct FILE" ע"י typedef בספריה stdio.h. -נלמד בהמשך.)


כדי לעבוד עם קובץ, צריך קודם לפתוח אותו. (כך שהוא ירוץ ב RAM של המחשב)
לשם כך משתמשים בפונקציה:
fopen ( __ שם או נתיב__ , __mode__ );
באופן הבא:

#include <stdio.h>
void main( ) {
FILE *fp ;
fp = fopen ( __שם או נתיב__ , __mode__ );
if (fp == NULL) {  // NULL אם פתיחת הקובץ נכשלה המצביע יקבל 
       printf ("Can't open file");
       exit (0);    // stdlib.h בחלק מהמקרים על מנת להשתמש בפקודה הזאת יש להוסיף את הספרייה 
     }
.
.
.
}



נפרט על הפרמטרים:
* שם או נתיב (path)
 - אם מופיע בשדה זה רק שם הקובץ (לדוגמה tt.txt ) אזי הוא יופיע בין גרשיים (כלומר "tt.txt" ) ובמקרה הזה הקובץ
    נמצא/ימצא באותה תיקייה בה נמצאת התוכנית שלנו. (יש בוויזואל סטודיו מקש קיצור לתיקייה זו, מופיע ב"תמונה מספר 1")

 - נתיב יופיע ללא גרשיים. (לדוגמה D:\rrrr.txt ) -*מצאתי חוסר עקביות בכלל הזה-


 אפשר גם לבקש את השם/נתיב מהמשתמש:
printf("Enter path:\n");
 gets(str);
 fp = fopen(str,"w"); // יוסבר בהמשך "w"

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


תמונה מספר 1






*mode (מצב)
בשדה זה נציין מהו סוג הקובץ אותו פותחים ומהן ההרשאות הדרושות לפעולות שאנו נעשה עליו. (הכל בין גרשיים)

סוגי ההרשאות:
     "r"  לקריאה בלבד. הקובץ חייב להיות קיים ואפשר לקרוא אותו (אחרת מחזיר NULL)
   "w"  לכתיבה. אם כבר היה קיים קובץ בעל שם/נתיב זהה אז הקודם נמחק. אם לא אז נפתח מחדש.
    "a"  כתיבה בסוף קובץ קיים (צירוף). אם הקובץ לא קיים אז נפתח חדש.
.קריאה + כתיבה, קריאה וכתיבה על התוכן הישן שלא נמחק  "r+"  
.כתיבה + קריאה, קודם הכל נמחק ואח"כ קוראים ממה שכתבו  "w+"
.צירוף + קריאה, אפשר להוסיף על תוכן קיים ולקרוא שינויים  "a+" 

סוג הקובץ יכול להיות באחד משני מצבים: קובץ טקסט או קובץ בינרי. (בינרי = כל קובץ בעולם מלבד קובץ טקסט).
t מסמן טקסט. (זו ברירת המחדל ואפשר פשוט לא לכתוב כלום)
b מסמן בינרי.

דוגמאות:
  fp = fopen("some_text.txt","r");
  fp = fopen("some_text.txt","rt");   // אותו דבר כמו השורה מעליו
  fp = fopen("new_file.txt""wt");
  fp = fopen("new_file.txt""wb");


.................................................................................................................................................................


בסיום העבודה עם הקובץ יש לסגור אותו. כדי שלא יתפוס מקום מיותר בזיכרון.
את זה עושה הפונקציה:
fclose (fp);  // הוא עדיין המצביע על הקובץ fp







פעולות בסיסיות על קובץ טקסט:

fgetc( מצביע קובץ )
לקליטת תו מקובץ טקסט.
לדוגמה: (ch הוא משתנה מסוג char )
ch = fgetc(fp);

fputc(מצביע קובץ , ערך אסקי של תו)
להדפיס תו לקובץ.
לדוגמה:
fputc( '#' , fp );

feof( מצביע קובץ )
בדיקה אם הגענו לסוף הקובץ או לא.
מחזירה true אם כן הגענו לסוף הקובץ, אחרת false (* שווה לNULL)
לדוגמה:
if (!feof (fp)) {.....}



דוגמה:
נדפיס למסך את התוכן מקובץ טקסט:

 while(!feof(fp)){
  ch = fgetc(fp);
  putchar(ch);
 }
שימו לב שעל אף שהפונקציה fgetc מקבלת תמיד את אותו מצביע fp, אותו לא שינינו לאורך התוכנית,
ch יקבל בכל איטרציה את התו הבא בקובץ. זאת משום שאחד השדות בקובץ הוא "מצביע הקריאה", והוא אומר
לפונקציה fgetc (וכן לכל הפונקציות שקוראות\כותבות לקובץ) מאיפה להתחיל. מצביע הקריאה מתקדם בסוף כל פקודה של קריאה\כתיבה לקובץ.
נפרט עליו עוד בשיעור בא.






fprintf( כל הערכים של הדפסה רגילה  , מצביע קובץ)
כמו הפונקציה printf רק שהפרמטר הראשון שלה הוא מצביע לקובץ, והפלט לא עובר למסך השחור אלא לקובץ.
לדוגמה:
fprintf(fp , "Hello");

fscanf( כל הערכים של קליטה רגילה  , מצביע קובץ)
כמו הפונקציה scanf רק שהפרמטר הראשון שלה הוא מצביע לקובץ, והקלט לא מגיע מהמשתמש אלא מהקובץ.
לדוגמה:  (n הוא משתנה מסוג int )
fscanf(fp , "%d",&n);



fgets( מצביע קובץ , מקסימום תווים לקבל אם אין אנטר  , שם המערך המקבל)
fgets( char *s , int max , FILE *fp )                       :ניסוח באנגלית
קולטת מקובץ הטקסט עליו מצביע fp מחרוזת תווים עד האנטר הראשון (לא כולל האנטר), או עד שנקלטו max תווים. (הראשון מבניהם) ושומרת את אותם תווים במערך s .


fputs( מצביע קובץ , שם המערך הנותן)                                     
fputs( char *s , FILE *fp )                         :ניסוח באנגלית
מדפיסה את מחרוזת התווים במערך s לקובץ טקסט עליו מצביע fp, ואח"כ מדפיסה גם "ירידת שורה" לאותו קובץ.
















שאלה 1:
כתוב תוכנית אשר קולטת שם של קובץ (קובץ txt) , ומוצאת:
גודל הקובץ. (כמות התווים)
כמות המלים בקובץ. (כל שתי מילים מופרדות ע"י תו לבן אחד לפחות. היינו 'n\' או 't\' או ' ').


שאלה 2:
כתוב תוכנית אשר קולטת שם של קובץ txt ומוצאת את כמות המופעים של כל
אחת מהספרות.




בהצלחה!
ראה גם: ויקיספר






תשובות: (לא רשמי)



אין תגובות:

הוסף רשומת תגובה