4.3 קבצים פתרון
פתרונות¶
פתרון 1¶
FILE *f = fopen("output.txt", "w");
if (f == NULL) return 1;
fprintf(f, "שורה ראשונה\n");
fprintf(f, "שורה שניה\n");
fprintf(f, "שורה שלישית\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("המיקום הנוכחי: %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
לגבי הסעיף האחרון, ההסבר הוא בדיוק כמו שכתוב בהרצאה :)