- •Тема 7. Строки, потоки, файлы.
- •1. Строки.
- •1.1. Создание строк
- •1.2. Присваивание строк
- •1.3. Сравнение строк
- •1.4. Длина строки
- •1.5. Преобразования строк
- •2. Файлы и потоки.
- •2.1. Понятие файла и потока.
- •1.6. Объединение строк
- •1.7. Другие функции для работы со строками
- •2.2. Указатель на файл, открытие файла, обработка ошибок, закрытие файла, изменение режима открытия.
- •2.3. Чтение из файла и запись в файл
- •2.4. Позиционирование в потоке.
- •2.5. Контроль исполнения потоковых операций.
2.2. Указатель на файл, открытие файла, обработка ошибок, закрытие файла, изменение режима открытия.
Все функции, необходимые для работы с потоками, описаны в заголовочном файле stdio.h.
Прежде чем начать работу с потоком, его следует открыть. При этом поток связывается в программе со структурой предопределенного типа FILE. Определение этой структуры находится в заголовочном файле stdio.h. В структуре FILE содержатся компоненты, с помощью которых ведется работа с потоком. В результате открытия в программу возвращается указатель на эту структуру, который идентифицирует поток во всех последующих операциях.
Для открытия используется функция fopen():
#include <stdio.h>
...
FILE *fp;
...
fp = fopen(<имя_файла>,<режим_открытия>)
...
Здесь аргументы <имя_файла> и <режим_открытия> - указатели на массивы символов, содержащих соответственно имя файла, связанного с потоком, и строку режимов открытия.
Существует шесть основных режимов открытия:
"w" (write) |
новый текстовый файл открывается для записи. Если файл уже существовал, то его содержимое стирается и он создастся заново |
"r" (read) |
открывается только для чтения существующий текстовый файл |
"a" (append) |
текстовый файл открывается или создается для добавления в конец файла новой порции информации. |
"w+" (write) |
новый текстовый файл открывается для записи и последующей модификации. Если файл уже существует, то его содержание стирается. После открытия файла чтение и запись допустимы в любом месте, в том числе разрешена запись в конец файла. |
"r+" (read) |
существующий текстовый файл открывается как для чтения, так и для записи в любом месте файла; однако запись в конец, приводящая к увеличению размера файла недопустима. |
"a+" (append) |
текстовый файл открывается или создается с возможностью последующей модификации. В отличие от режима "w+" можно открыть существующий файл без уничтожения его содержимого; в отличие от режима "r+" можно записывать в конец файла, увеличивая его размеры. |
В случае использования двоичных файлов к строке режима открытия следует добавить символ "b" ("wb", "rb", "ab", "w+b", "r+b","a+b"). В этом случае все преобразования, связанные с обработкой концов строк, будут отсутствовать.
При открытии потока могут возникнуть ошибки, например, "указанный файл не найден", "диск заполнен", "диск защищен от записи" и ряд других. В случае ошибки функция fopen() возвращает указатель со значением NULL. Для вывода на экран сообщения об ошибке используется функция perror(), прототип которой описан в stdio.h:
void perror (const char *s);
Функция выводит строку символов, адресуемую указателем s, за которой размещается двоеточие, пробел и сообщение об ошибке. Содержимое и формат сообщения определяются используемой системой программирования. Текст сообщения об ошибке выбирается функцией на основании номера ошибки. Этот номер заносится в глобальную переменную с именем errno ( определенную в заголовочном файле errno.h) при реализации библиотечных функций ввода-вывода.
По завершению работы с файлом его рекомендуется закрыть при помощи функции
int fclose(<указатель_на_поток>);
Открытый файл можно открыть повторно (например, для изменения режима работы с ним) только после того, как файл будет закрыт с помощью функции fclose().
Для изменения режима открытия файла существует функция
FILE * freopen(<имя_файла>,<режим_открытия>,<указатель_на_поток>)
Типичный фрагмент программы, связанный с открытием файла выглядит следующим образом:
if ((fp = fopen("Example.txt","w")) == NULL)
{
perror("Error opening file Exampl.txt \n");
exit(0);
}
