4.3 - קבצים - פתרון
פתרונות¶
פתרון 1¶
FILE *f = fopen("output.txt", "w");
if (f == NULL) return 1;
fprintf(f, "First line\n");
fprintf(f, "Second line\n");
fprintf(f, "Third line\n");
fclose(f);
פתרון 2¶
FILE *f = fopen("input.txt", "r");
if (f == NULL) return 1;
char line[256];
while (fgets(line, sizeof(line), f)) {
printf("%s", line);
}
fclose(f);
פתרון 3¶
FILE *src = fopen("input.bin", "rb");
FILE *dest = fopen("copy.bin", "wb");
if (!src || !dest) return 1;
char buf[64];
size_t bytes;
while ((bytes = fread(buf, 1, sizeof(buf), src)) > 0) {
fwrite(buf, 1, bytes, dest);
}
fclose(src);
fclose(dest);
פתרון 4¶
FILE *f = fopen("data.bin", "rb");
if (!f) return 1;
fseek(f, 10, SEEK_SET);
char buf[6] = {0};
fread(buf, 1, 5, f);
for (int i = 0; i < 5; i++) {
putchar(buf[i]);
}
putchar('\n');
long pos = ftell(f);
printf("Current position: %ld\n", pos);
fclose(f);
פתרון 5¶
הסבר: מהו file descriptor (fd)?¶
הfile descriptor (או בקיצור fd) הוא מספר שלם שמערכת ההפעלה נותנת לנו ברגע שאנחנו פותחים קובץ (או משאב אחר, כמו טרמינל, pipe, או קובץ רשת).
ה-fd הוא בעצם מזהה של הקובץ - הוא מייצג עבור מערכת ההפעלה את החיבור בין הקוד שלנו לבין הקובץ שהיא שומרת עליו.
לדוגמה:
כאן, המשתנה fd יקבל מספר כמו 3 או 4 - בהתאם למה שפתוח כרגע - וזה מה שנשתמש בו כשנרצה לקרוא או לכתוב לקובץ.
מה הם fd 1, 2, ו-0?¶
מערכת ההפעלה פותחת באופן אוטומטי שלושה file descriptors בתחילת כל תוכנית:
| מספר fd | שם | תיאור |
|---|---|---|
| 0 | stdin | קלט מהמשתמש (לרוב מהמקלדת) |
| 1 | stdout | פלט רגיל (לרוב למסך) |
| 2 | stderr | הודעות שגיאה (לרוב למסך) |
ולכן:
- fd 0 הוא stdin
- fd 1 הוא stdout
- fd 2 הוא stderr
לגבי הסעיף האחרון, ההסבר הוא בדיוק כמו שכתוב בהרצאה :)