є аргументів; копіює *
* стандартний ввід * / (stdin, stdout); (- argc> 0) ((fp=fopen (* + + argv, «r»)) == NULL) {( " cat: can't open% s n, * argv); 1;
} else {(fp, stdout); (fp); 0;
}
/ * filecopy: копіює файл ifp до файлу ofp * / filecopy (FILE * ifp, FILE * ofp)
{c; ((c=getc (ifp))!=EOF) (c, ofp);
}
покажчики на файл stdin и stdout являються об'єктами типу FILE *. Незважаючі на це, смороду є константами (сталь), а не зміннімі, что внеможлівлює Надання їм нового значення.
Функція
fclose (FILE * fp)
являється протілежністю fopen, вона розріває зв'язок между покажчики на файл и зовнішньою Назв, отриманий fopen, звільняючі покажчик для Іншого файлу. Оскількі більшість операційніх систем мают певне обмеження кількості файлів, Які программа в змозі Відкрити одночасно, добре ідеєю буде звільніті покажчики на файли, ЯКЩО їх больше не нужно, як ми це зробили в cat. Існує такоже Інша причина сделать fclose для файла виводу - це очищує буфер, в якому putc накопічує вивід. fclose віклікається автоматично для шкірного відкритого файлу при нормальному завершенні програми. (Ві можете замкнути stdin и stdout, ЯКЩО смороду непотрібні. Їх такоже можна перепрізначіті помощью бібліотечної Функції freopen.)
Обробка помилок у cat НЕ є Ідеальною. Проблема в тому, что ЯКЩО Неможливо дістатіся до одного з файлів з якоїсь причини, діагностічне ПОВІДОМЛЕННЯ буде Виведення в кінці зчеплення виводу. Це, Можливо, допустимо, ЯКЩО вивід Направляється на екран, альо НЕ тоді, коли ВІН Надходить у файл або іншу програму через конвеєр.
Щоб краще справлятіся з подібнімі сітуаціямі, програмам надається другий потік виводу под назв stderr, поряд Із stdin и stdout. Вивід, Записаний до stderr, як правило, з'являється на екрані даже ЯКЩО стандартний вивід перенаправлено.
Давайте віправімо cat так, щоб писати его ПОВІДОМЛЕННЯ про помилки до стандартної помилки.
# include
/ * cat: зчеплює файли, 2-а версія * / (int argc, char * argv [])
{* fp; filecopy (FILE *, FILE *); * prog=argv [0];/* Назва програми, для помилок * / (argc == 1) / * немає аргументів; копіює *
* стандартний ввід * / (stdin, stdout); (- argc> 0) ((fp=fopen (* + + argv, «r»)) == NULL) {( stderr, «% s: can't open% s n»,, * argv); (1);
} else {(fp, stdout); (fp);
} (ferror (stdout)) {(stderr, «% s: error writing stdout n», prog), (2);
} (0);
}
Програма сігналізує помилки в два способи. Перший: діагностичний вивід, спрічіненій fprintf Надходить до stderr, тож ВІН знаходится свій шлях на екран вместо того, щоб знікнуті кудись через конвеєр або в файлі виводу. Мі включили в ПОВІДОМЛЕННЯ Назву програми з argv [0], тож, ЯКЩО программа вікорістовується разом з іншімі, джерело помилки буде ідентіфіковано.
Другий: программа вікорістовує функцію стандартної бібліотеки exit, яка завершує Виконання програми, ЯКЩО ее віклікано. Аргумент exit стане Доступний будь-якому процесові, Я...