קבצי מחשב
קובץ מחשב הוא קובץ שאנו משתמשים בו על מנת לאכסן נתונים בפורמט דיגיטלי, כמו למשל טקסט או תמונה כאשר קבצים יכולים להיות מאורגנים בתוך תיקיות. ניתן לראות בקבצי מחשב כחלופה דיגיטלית למסמכים מנייר. כאשר אנחנו מתכנתים, קוד המקור שלנו נשמר בקבצי טקסט בעלי סיומות שונות. בשפת C למשל, קבצי התכנות נשמרים עם סיומת c., קבצי התכנות בשפת Java נשמרים עם הסיומת java. וקבצי התכנות בשפת Python נשמרים עם הסיומת py..
פלט וקלט של קבצים File Input/Output
בדרך כלל אנו יוצרים קבצים בעורכי טקסט שונים כגון Notepad ו-MS Word, אך לעתים אנו יוצרים קבצים בתוכנות מחשב שונות. קלט הקובץ Input הוא מידע אשר נכתב אל תוך תוך הקובץ, ופלט הקובץ Output הוא מידע שנקרא מתוך הקובץ. קלט ופלט Input/Output הם מושגים שאנו בדרך כלל משתמשים בהם יותר בהקשר של מסך המחשב, כפי שעשינו במהלך כל הקורס כאשר הוצאנו פלט של תכניות שכתבנו.
מצב פעולת קבצים File Operation Modes
כאשר אנו צריכים לפתוח קובץ קיים או קובץ חדש, אנו יכולים לפתוח קובץ במספר מצבים:
- מצב קריאה בלבד Read-Only Mode – אם ברצונכם רק לקרוא מתוך קובץ מבלי לכתוב לתוכו, בשפות תכנות יש תחביר שבאמצעותו תוכלו לפתוח קבצים במצב קריאה בלבד
- מצב כתיבה בלבד Write-Only Mode – אם ברצונכם רק לכתוב לתוך קובץ מבלי לקרוא מתוכו, בשפות תכנות יש תחביר שבאמצעותו תוכלו לפתוח קבצים במצב כתיבה בלבד
- מצב קריאה וכתיבה Read & Write Mode – אם ברצונכם גם לכתוב וגם לקרוא מתוך הקובץ, נפתח את הקובץ במצב מצב קריאה וכתיבה
- מצב סיפוח Append Mode – כאשר אנו פותחים קובץ לשם כתיבה בתוכו, המידע שאנו מזינים יתחיל להיכתב מתחילת הקובץ, כלומר שזה ייכתב במקום המידע שהיה קיים בקובץ. אם אנחנו לא רוצים לשכתב את תוכן הקובץ הקיים, עלינו לפתוח את הקובץ במצב סיפוח Append Mode. מצב סיפוח הוא מצב הכתיבה האולטימטיבי, שכן המידע ייכתב מסוף הקובץ. כמעט בכל שפות התכנות הקיימות יש תחביר שבאמצעותו ניתן לפתוח קובץ במצב סיפוח Append Mode
פתיחת קובץ
על מנת לפתוח קובץ קיים או ליצור קובץ חדש, יש בשפת C פונקציה מובנית שנקראת ( )fopen. פקודה זו תאתחל אובייקט מסוג קובץ FILE, אשר יכיל את כל המידע הנחוץ. התחביר לפתיחת קובץ בשפת C ייראה כך:
FILE *fopen( const char * filename, const char * mode );
filename הוא שם הקובץ, ו-mode הוא מצב ההפעלה של הקובץ. בטבלה שלפניכם תוכלו לראות באיזה סימן עליכם להשתמש כדי להפעיל את הקובץ במצב מסוים:
סגירת קובץ
על מנת לסגור קובץ יש להשתמש בפונקציה ( )fclose:
FILE *fopen( const char * filename, const char * mode );
הפונקציה ( )fclose מחזירה את הערך 0 במידה והיא מצליחה או EOF, במידה ויש שגיאה בסגירת התוכנית הפונקציה ( )fclose תחזיר תו מיוחד. פונקציה זו למעשה סוגרת את הקובץ ומשחררת את זיכרון המחשב שנוצל על ידי הקובץ. אנו מגדירים את ה-EOF בראש הקובץ כך – stdio.h.
בחבילת C סטנדרטית יש בדרך כלל מגוון של פונקציות שניתן להשתמש בהם על מנת לקרוא ולכתוב לתוך קבצים כאשר מיד נראה חלק מהם, לקריאה מורחבת בנושא זה ואחרים יש לפנות למדריך מקיף לשפת C.
כתיבה בקובץ
על מנת לכתוב בקובץ יש להשתמש בפונקציה ( )fputc:
int fputc( int c, FILE *fp );
הפונקציה ( )fputc כותבת את הערך המשתנה c אל קלט קובץ FILE בשם fp. אם הפונקציה הצליחה לכתוב היא תחזיר 0 ואם תיכשל אז תחזיר EOF. אם השתמשתם עד כה במהדר שהתקנתם על המחשב, נסו להדר את התוכנית הבאה שתפתח קובץ בשם test.txt בתיקייה tmp/ ותכתוב שתי שורות על ידי שימוש בשתי פונקציות :
#include <stdio.h> int main() { FILE *fp; fp = fopen("/tmp/test.txt", "w+"); fprintf(fp, "This is testing for fprintf...\n"); fputs("This is testing for fputs...\n", fp); fclose(fp); }
קריאה מתוך קובץ
על מנת לקרוא מתוך קובץ יש להשתמש בפונקציה ( )fgetc:
int fgetc( FILE * fp );
הפונקציה ( )fgetc קוראת תווים מתוך הקובץ FILE בשם fp, במידה והצליחה הפונקציה תחזיר ערך read, ואם נכשלה תחזיר EOF. התוכנית הבאה תיקח מידע מתוך הקובץ שייצרנו מקודם, תקרא מתוכו נתונים ותציג אותם כפלט:
#include <stdio.h> main() { FILE *fp; char buff[255]; fp = fopen("/tmp/test.txt", "r"); fscanf(fp, "%s", buff); printf("1 : %s\n", buff ); fgets(buff, 255, (FILE*)fp); printf("2: %s\n", buff ); fgets(buff, 255, (FILE*)fp); printf("3: %s\n", buff ); fclose(fp); }
ואז נקבל את התוצאה הבאה:
קובץ File I/O בשפת java
שפת Java מספקת מערך נרחב של פונקציות למניפולציית קלט ופלט של קבצים FILE I/O, לקריאה מורחבת בנושא יש לפנות למדריך מקיף לשפת Java. כעת נכתוב דוגמה של אותה התוכנית, כאשר הפעם היא נכתבה בשפת Java:
import java.io.*; public class Main { public static void main(String []args) throws IOException { File file = new File("/tmp/java.txt"); // Create a File file.createNewFile(); // Creates a FileWriter Object using file object FileWriter writer = new FileWriter(file); // Writes the content to the file writer.write("This is testing for Java write...\n"); writer.write("This is second line...\n"); // Flush the memory and close the file writer.flush(); writer.close(); // Creates a FileReader Object FileReader reader = new FileReader(file); char [] a = new char[100]; // Read file content in the array reader.read(a); System.out.println( a ); // Close the file reader.close(); } }
על מנת שנקבל את התוצאה הבאה: :
...This is testing for Java write ...This is second line
קובץ File I/O בשפת Python
זוהי דוגמה של אותה התוכנית, כאשר הפעם היא נכתבה בשפת Python:
# Create a new file fo = open("/tmp/python.txt", "w") # Writes the content to the file fo.write( "This is testing for Python write...\n"); fo.write( "This is second line...\n"); # Close the file fo.close() # Open existing file fo = open("/tmp/python.txt", "r") # Read file content in a variable str = fo.read(100); print str # Close opened file fo.close()
על מנת שנקבל את התוצאה הבאה: :
...This is testing for Python write ...This is second line