לדלג לתוכן

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 הוא בעצם מזהה של הקובץ - הוא מייצג עבור מערכת ההפעלה את החיבור בין הקוד שלנו לבין הקובץ שהיא שומרת עליו.

לדוגמה:

int fd = open("data.txt", O_RDONLY);

כאן, המשתנה 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

לגבי הסעיף האחרון, ההסבר הוא בדיוק כמו שכתוב בהרצאה :)