русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Доступ до файлів


Дата додавання: 2014-11-28; переглядів: 873.


Приклади, з якими ми досі стикалися, усі читали стандартний ввід і записували до стандартного виводу, які автоматично визначаються для програми операційною системою.

Наступним кроком буде написати програму, яка матиме доступ до файла. Одна з програм, що демонструє необхідність таких операцій, це cat, яка зчеплює набір вказаних їй файлів, виводячи їх на стандартний пристрій виводу. cat використовується для видруку файлів на екрані і як збирач вводу загального призначення для програм, які не мають можливості доступу до файлів за іменем. Наприклад, команда

cat x.c y.c

виводить вміст файлів x.c та y.c (і нічого більше) на стандартний пристрій виводу. Питання в тому, як забезпечити прочитання даних файлів, тобто, як під'єднати зовнішні назви, про які думає користувач, до твердження, яке читатиме дані.

Правила — прості. Перед тим як його можна прочитати або здійснити до нього запис, файл потрібно відкрити за допомогою бібліотечної функції fopen. fopen візьме зовнішні назви, такі як x.c або y.c, здійснить певні службові дії і переговори з операційною системою (деталі яких не повинні нас хвилювати), і повертає покажчик, який використовуватиметь в наступних читаннях і записах до файла.

Цей покажчик, який називається покажчиком файла, вказує на структуру, яка містить інформацію про файл, таку як місцеперебування буфера, поточне положення знака в буфері, чи файл читається, чи до нього йде запис, і, чи мали місце помилки або вказівник кінця файла. Користувачі не повинні знати подробиць, оскільки визначення, що знаходяться в <stdio.h>включають оголошення структури під назвою FILE. Єдине, що потрібно знати, це оголошення покажчика файла, яке спрощено виглядає як

FILE *fp;

FILE *fopen(char *name, char *mode);

Це означає, що fp є покажчиком на (структуру типу) FILE і fopen повертає покажчик на FILE. Замітьте, що FILE, це назва типу, така сама як int, а не мітка структури; її означено за допомогою typedef. (Деталі щодо того як можна втілити fopen на UNIX надано в Розділі 8.5.) Виклик fopen у програмі має вигляд

fp = fopen(name, mode);

Першим аргументом fopen є символьний ланцюжок, що містить назву файла. Другий аргумент — це режим, також символьний ланцюжок, який вказує на те, як буде використовуватись файл. Допустимими режимами можуть бути режим читання («r» — read), запису («w» — write) і долучення («a» — append). Деякі системи розрізняють текстові і бінарні файли, для останніх потрібно додати «b» (binary) до літери режиму.

Якщо файл, якого не існує, відкрито для запису або додання, його буде створено, якщо це можливо. Відкриття наявного файла для запису спричинить звільнення старого змісту, тоді як відкриття для дозапису (доточення) — збереже старий зміст. Спроба прочитання файла, якого не існує, викличе помилку; існують також інші причини помилок, як скажімо спроба прочитати файл, на який ви не маєте дозволу. Якщо сталася якась помилка, fopen повертає NULL. (Характер помилки можна визначити точніше; подивіться обговорення функцій з обробки помилок у Розділі 1 Додатка Б.)

Наступний крок — мати спосіб читання або запису до файла після того, як його відкрито. getcповертає наступний знак з файла; вона вимагає покажчика на файл, щоб знати, який саме файл.

int getc(FILE *fp)

getc повертає наступний знак з потоку, на який вказує fp; вона повертає EOF у випадку кінця файла або помилки.

putc - це функція виводу:

int putc(int c, FILE *fp)

putc запише символ з c до файла fp і поверне записаний знак або EOF у випадку помилки. Так само як getchar і putchar, getc із putc можуть бути макросами, а не функціями. Під час запуску C-програми, середовище операційної системи бере на себе завдання відкриття трьох файлів і надання покажчиків до них. Ці файли — це стандартний ввід, стандартний вивід і стандартна помилка; відповідні їм покажчики називаються stdin, stdout і stderr, і оголошено в <stdio.h>. За звичайних обставин, stdin сполучено з клавіатурою, тоді якstdout із stderr — з екраном, але stdin і stdout можна перенаправити в інші файли або конвеєри, як описано в Розділі 7.1.

getchar і putchar можна визначити через getc, putc, stdin і stdout наступним чином:

#define getchar() getc(stdin)

#define putchar(c) putc((c), stdout)

Для форматованого вводу або виводу із файлами, можна використати функції fscanf іfprintf. Вони тотожні scanf із printf за винятком того, що першим сргументом є покажчик на файл, який вказує на, власне, файл, який читатиметься; другим аргументом є ланцюжок формату.

int fscanf(FILE *fp, char *format, ...)

int fprintf(FILE *fp, char *format, ...)

Маючи такий начерк, ми тепер можемо написати власну програму cat для зчеплення файлів. Схема буде тією самою, що виявилась корисною в багатьох інших програмах. Якщо існують аргументи командного рядка, їх буде інтерпретовано як назви файлів і оброблено по-порядку. Якщо немає аргументів, обробляється стандартний ввід.

#include <stdio.h>

 

/* cat: зчеплює файли, 1-а версія */

main(int argc, char *argv[])

{

FILE *fp;

void filecopy(FILE *, FILE *)

 

if (argc == 1) /* немає аргументів; копіює *

* стандартний ввід */

filecopy(stdin, stdout);

else

while(--argc > 0)

if ((fp = fopen(*++argv, "r")) == NULL) {

printf("cat: can't open %s\n, *argv);

return 1;

} else {

filecopy(fp, stdout);

fclose(fp);

}

return 0;

}

 

/* filecopy: копіює файл ifp до файла ofp */

void filecopy(FILE *ifp, FILE *ofp)

{

int c;

 

while ((c = getc(ifp)) != EOF)

putc(c, ofp);

}

Покажчики на файл stdin і stdout являються об'єктами типу FILE *. Незважаючи на це, вони є константами (сталими), а не змінними, що внеможливлює надання їм нового значення.

Функція

int fclose(FILE *fp)

являється протилежністю fopen, вона розриває зв'язок між покажчиком на файл і зовнішньою назвою, отриманою fopen, звільняючи покажчик для іншого файла. Оскільки більшість операційних систем мають певне обмеження кількості файлів, які програма в змозі відкрити одночасно, хорошою ідеєю буде звільнити покажчики на файли, якщо їх більше не потрібно, як ми це зробили в cat. Існує також інша причина зробити fclose для файла виводу — це очищує буфер, в якому putc накопичує вивід. fclose викликається автоматично для кожного відкритого файла при нормальному завершенні програми. (Ви можете замкнути stdin і stdout, якщо вони непотрібні. Їх також можна переназначити за допомогою бібліотечної функціїfreopen.)


<== попередня лекція | наступна лекція ==>
Форматований ввід - scanf | Обробка помилок - stderr і exit


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн