Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
часть 2.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
367.1 Кб
Скачать

Файлы Цель работы

Изучение средств создания и обработки файлов последовательного и прямого доступа.

Методические указания

  1. Понятие файла

Файл – это упорядоченная совокупность произвольного числа компонент, расположенная на внешнем запоминающем устройстве и имеющая единое имя, называемое физическим именем файла. В программе на языке Си файлу соответствует внутреннее логическое имя файла <поток>. Для пользователя все файлы в языке Си рассматриваются как последовательности, потоки байтов.

Для файла определен маркер (указатель чтения/записи). Он указывает текущую позицию файла, к которой осуществляется доступ.

С началом работы любой программы автоматически открываются некоторые стандартные потоки, например, стандартный ввод (stdin) и стандартный вывод (stdout). По умолчанию они связаны с клавиатурой и экраном терминала соответственно.

  1. Объявление файла

Внутреннее логическое имя файла <поток> должно быть объявлено в программе с помощью оператора FILE *<поток>;

Тип FILE – это структура, определенная в stdio.h с помощью средства typedef и содержащая некоторую информацию о файле: например, флаги состояния файла, размер буфера, указатель на буфер и др.

Например, после объявления

FILE *fp;

fp будет являться указателем на структуру типа FILE. С файлами можно производить такие действия, как создание и открытие файла, чтение и запись, закрытие файла. Чтобы в программе использовать функции для работы с файлом, необходимо директивой # include включить в программу файл stdio.h.

  1. Открытие файла

Перед выполнением операций ввода–вывода данных файла необходимо его открыть с помощью функции fopen:

<поток> = fopen (“<имя файла>”, “<тип>”);

Эта функция связывает внутреннее логическое имя файла <поток>, объявленное в программе как указатель на структуру типа FILE, с физическим именем файла, указанным параметром <имя файла>. При успешном открытии файла функция fopen возвращает указатель на структуру типа FILE. Этот указатель используется для последующих операций с файлом.

Параметр <тип> определяет, как должен использоваться файл:

r” – файл открывается для чтения (файл должен существовать);

w” – файл открывается для записи;

a” – файл открывается для записи в конец файла (добавления).

Например, с помощью оператора

fp = fopen (“data.txt”, “r”);

открывается для чтения файл data.txt и связывается с указателем fp.

Можно задавать не только имя файла, но и путь к файлу.

Если для записи (“w”) или добавления (“a”) открывается несуществующий файл, то он создается.

Внимание: если для записи (“w”) открывается существующий файл, то его содержимое теряется.

Если при открытии файла произошла ошибка, то функция fopen возвращает значение NULL.

Пример:

# include <stdio.h>

void main ()

{

FILE *p;

if ((p = fopen (“data2”, “r”))! = NULL) / *проверка – успешно ли */

/*открыт файл */

{ …

/* работа с файлом */

}

else

printf (“\n Ошибка открытия файла data2”);

}

  1. Закрытие файла

После окончания работы с файлом он обязательно должен быть закрыт с помощью функции

fclose (<поток>).

Пример:

FILE *p;

fclose (p); /*закрыть файл */

Функция fclose возвращает значение 0, если файл закрыт успешно, и значение EOFв противном случае.

Константа EOF, определенная в файле stdio.h, обозначает признак конца файла. Пример использования константы EOF дан в п. 5.1.

  1. Ввод–вывод данных файла

Функции, используемые для ввода с клавиатуры и вывода на экран, имеют аналоги для ввода-вывода данных файла. Особенностью функций ввода–вывода данных файла является то, что в них необходимо использовать указатель типа FILE, определяющий с каким файлом им следует работать. Рассмотрим функции, предназначенные для обмена данными различных типов с файлами.

    1. Ввод–вывод символа

Обмен символьной информацией с файлом может быть осуществлен с помощью функций getc и putc.

Для вывода символа из файла служит функция getc. Функция getc возвращает значение типа int. Оператор вывода символа из файла в общем виде записывается так:

<переменная> = getc (<поток>).

Так, например, оператор

ch = getc (in);

обеспечивает вывод символа из файла, на который ссылается указатель in типа FILE, и при этом символ запоминается в переменной ch.

Если обнаруживается ошибка или достигается конец файла, то функция qetc возвращает значение EOF.

Функция

putc (<символ>, <поток>);

обеспечивает запись символа в файл. Например, оператор putc (‘A’, out); обеспечивает запись символа ‘A’ в файл, на который ссылается указатель out типа FILE.

Ниже приведена программа, в которой используются функции getc и putc.

/* программа читает файл text и выводит его на экран */

# include <stdio.h>

main ( )

{

FILE *in;

char ch;

if ((in = fopen (“text”, “r”))! = NULL)

{

while ((ch = getc (in))! = EOF) /*считывать символы из файла

/* пока не конец файла */

putchar (ch); /*вывести символ на экран*/

fclose (in); /* закрыть файл*/

}

else

printf (“\n Ошибка открытия файла text”);

}

В приведенной программе использована константа EOF, обозначающая признак конца файла.

5.2. Ввод–вывод строки

Ввод–вывод строки реализуется с помощью функций fgets и fputs. Функция

fgets (string, n, <поток>);

читает строку из файла, на который указывает <поток> и помещает ее в строку, адрес которой задается значением параметра string. Функция прекращает работу после считывания символа новой строки ‘\n’ или после считывания n–1 символов в зависимости от того, что произойдет раньше. После этого в конец строки добавляется нуль–символ ‘\0’. Например, функция

fgets (s, 20, f1);

считывает символы из файла, на который ссылается указатель f1, в строку s, максимальная длина которой 20 байт.

Функция fgets возвращает значение NULL, если произошла ошибка или достигнут конец файла.

Функция

fputs (string, <поток>);

записывает строку string в файл, на который указывает <поток>. Эта функция не ставит завершающий символ ‘\0’ в конец копируемой строки.

5.3. Ввод–вывод целого

Значение целого типа может быть прочитано из файла или записано в него с помощью функций getw и putw, действие которых аналогично действию функций getc и putc. Функция getw обеспечивает вывод значения целого типа из файла, а функция putw – запись значения целого типа в файл. Эти функции имеют следующий формат:

getw (<поток>);

putw (<целое>, <поток>);

Функция getw читает очередное значение типа int из файла и продвигает внутренний указатель этого файла на следующий еще не прочитанный элемент файла. Функция getw возвращает прочитанное целое значение, а если была обнаружена ошибка или встретился конец файла, то она возвращает значение EOF.

5.4. Форматированный ввод–вывод

Функции форматированного ввода и вывода в файл имеют вид:

fscanf (<поток>, <управляющая строка>, <список аргументов>);

fprintf (<поток>, <управляющая строка>, <список аргументов>).

Действие этих функций аналогично действию функций scanf и printf, но в функциях fscanf, fprintf дополнительно вводится еще один аргумент – указатель на файл <поток>, который используется в качестве первого аргумента функций. Ниже приведен пример использования функций fscanf и fprintf.

/* программа считывает одно значение из файла data и добавляет его */

/* в файл result */

# include <stdio.h>

main ( )

{

FILE *f;

int c;

f = fopen (“data”, “r”); /* открыть файл data для чтения */

fscanf (f, “%d”, & c);

fclose (f);

f = fopen (“result”,”a”); /* открыть файл result для добавления */

fprintf (f, “%d\n”, c);

fclose (f);

}

В данной программе стало возможным использование одного указателя f для двух различных файлов потому, что первый файл был закрыт прежде, чем открыт второй.

  1. Прямой доступ к файлу

В языке Си можно организовать прямой доступ к компонентам файла как к элементам массива. Для этого служит функция

fseek (<поток>, <позиция>, <код>);

позволяющая непосредственно достигать любого определенного байта в файле. Эта функция перемещает указатель текущей позиции файла от начальной точки на количество байт, указанное в параметре <позиция>, который должен иметь значение типа long. Если параметр <позиция> положителен, то происходит движение вперед, если же он отрицателен – назад. Аргумент <код> определяет начальную точку и может принимать одно из следующих значений:

0 – начало файла;

1 – текущая позиция файла;

2 – конец файла.

Функция fseek возвращает значение 0, если операция выполнена успешно, и ненулевое значение, если произошла ошибка.

Примеры использования функции fseek:

FILE *f;

fseek (f, 0L, 0); /* установить указатель текущей позиции файла */

/* на начало файла */

fseek (f, 0L, 2); /* установить указатель текущей позиции файла */

/* на конец файла */

Для работы с файлами могут быть полезны также функции, описанные ниже.

Функция

rewind (<поток>);

устанавливает указатель текущей позиции файла на начало файла.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]