- •Министерство образования Российской Федерации
- •Контрольные вопросы
- •Задания для выполнения
- •Варианты задания
- •Классы памяти. Массивы, операция индексации Цель работы
- •Контрольные вопросы
- •Варианты заданий
- •Массивы. Связь массивов и указателей Цель работы
- •Методические указания
- •Контрольные вопросы
- •Варианты заданий
- •Символьные строки
- •Контрольные вопросы
- •Варианты заданий
- •Функции. Основные правила использования функций
- •Контрольные вопросы
- •Варианты заданий
- •Функции. Использование массивов и функций в качестве формальных параметров
- •Контрольные вопросы
- •Варианты заданий
- •Контрольные вопросы
- •Варианты заданий
- •Файлы Цель работы
- •Методические указания
- •Функция
- •Контрольные вопросы
- •Варианты заданий
Файлы Цель работы
Изучение средств создания и обработки файлов последовательного и прямого доступа.
Методические указания
Понятие файла
Файл – это упорядоченная совокупность произвольного числа компонент, расположенная на внешнем запоминающем устройстве и имеющая единое имя, называемое физическим именем файла. В программе на языке Си файлу соответствует внутреннее логическое имя файла <поток>. Для пользователя все файлы в языке Си рассматриваются как последовательности, потоки байтов.
Для файла определен маркер (указатель чтения/записи). Он указывает текущую позицию файла, к которой осуществляется доступ.
С началом работы любой программы автоматически открываются некоторые стандартные потоки, например, стандартный ввод (stdin) и стандартный вывод (stdout). По умолчанию они связаны с клавиатурой и экраном терминала соответственно.
Объявление файла
Внутреннее логическое имя файла <поток> должно быть объявлено в программе с помощью оператора FILE *<поток>;
Тип FILE – это структура, определенная в stdio.h с помощью средства typedef и содержащая некоторую информацию о файле: например, флаги состояния файла, размер буфера, указатель на буфер и др.
Например, после объявления
FILE *fp;
fp будет являться указателем на структуру типа FILE. С файлами можно производить такие действия, как создание и открытие файла, чтение и запись, закрытие файла. Чтобы в программе использовать функции для работы с файлом, необходимо директивой # include включить в программу файл stdio.h.
Открытие файла
Перед выполнением операций ввода–вывода данных файла необходимо его открыть с помощью функции 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”);
…
}
Закрытие файла
После окончания работы с файлом он обязательно должен быть закрыт с помощью функции
fclose (<поток>).
Пример:
FILE *p;
fclose
(p);
/*закрыть
файл
*/
Функция fclose возвращает значение 0, если файл закрыт успешно, и значение EOF – в противном случае.
Константа EOF, определенная в файле stdio.h, обозначает признак конца файла. Пример использования константы EOF дан в п. 5.1.
Ввод–вывод данных файла
Функции, используемые для ввода с клавиатуры и вывода на экран, имеют аналоги для ввода-вывода данных файла. Особенностью функций ввода–вывода данных файла является то, что в них необходимо использовать указатель типа FILE, определяющий с каким файлом им следует работать. Рассмотрим функции, предназначенные для обмена данными различных типов с файлами.
Ввод–вывод символа
Обмен символьной информацией с файлом может быть осуществлен с помощью функций 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 для двух различных файлов потому, что первый файл был закрыт прежде, чем открыт второй.
Прямой доступ к файлу
В языке Си можно организовать прямой доступ к компонентам файла как к элементам массива. Для этого служит функция
fseek (<поток>, <позиция>, <код>);
позволяющая непосредственно достигать любого определенного байта в файле. Эта функция перемещает указатель текущей позиции файла от начальной точки на количество байт, указанное в параметре <позиция>, который должен иметь значение типа long. Если параметр <позиция> положителен, то происходит движение вперед, если же он отрицателен – назад. Аргумент <код> определяет начальную точку и может принимать одно из следующих значений:
0 – начало файла;
1 – текущая позиция файла;
2 – конец файла.
Функция fseek возвращает значение 0, если операция выполнена успешно, и ненулевое значение, если произошла ошибка.
Примеры использования функции fseek:
FILE *f;
fseek (f, 0L, 0); /* установить указатель текущей позиции файла */
/* на начало файла */
fseek (f, 0L, 2); /* установить указатель текущей позиции файла */
/* на конец файла */
Для работы с файлами могут быть полезны также функции, описанные ниже.
Функция
rewind (<поток>);
устанавливает указатель текущей позиции файла на начало файла.
