Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
11 - Файлы.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
311.88 Кб
Скачать

Режимы открытия файла в Си

В рассмотренных примерах использовались режимы открытия файла для записи – w и для чтения – r. Существуют еще ряд режимов, некоторые из которых приведены ниже:

Режим

Описание режима

открытия файла

Если файл не существует

Если файл существует

r

Чтение

Ошибка

-

w

Запись

Создается

Очищается

a

Добавление

Создается

-

r+

Чтение/запись

Ошибка

-

w+

Запись/чтение

Создается

Очищается

a+

Добавление/чтение

Создается

-

Бинарный и текстовый режимы

Для каждого текстового режима существует его бинарный аналог. Не всегда можно отличить, какой режим используется, поэтому мы рассмотрим специальный пример, который продемонстрирует нам отличие этих двух режимов. Итак, на Си бинарный режим определяется добавлением литеры «b».

Текстовый режим

r

w

a

r+

w+

a+

Бинарный режим

rb

wb

ab

rb+

wb+

ab+

Рассмотрим следующую задачу: подсчитать количество символов в файле. Данную задачу можно легко решить, считав содержимое файла посимвольно. Необходимо использовать переменную-счетчик.

//Функция подсчета размера файла

int getFileSize(FILE* file) {

//Помещаем файловый указатель в начало

rewind(file);

int size = 0;

while(!feof(file)) {

fgetc(file);

size++;

}

return size;

}

int main() {

//Открываем файл в текстовом режиме

FILE* txtFile = fopen("tutorial.cpp", "r");

//Открываем файл в бинарном режиме

FILE* binFile = fopen("tutorial.cpp", "rb");

cout<<"Размер файла в текстовом режиме:" << endl;

cout << getFileSize(txtFile) << "байт" << endl;

cout<<"Размер файла в бинарном режиме:" << endl;

cout << getFileSize(binFile) << "байт" << endl;

return 0;

}

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

Произвольный доступ к файлу

Файл предназначен для последовательного доступа к нему, другими словами, для обращения к определенному символу этого файла нужно прочитать все символы, расположенные перед ним. Однако существует функция fseek(), которая имитирует произвольный доступ. Эта функция перемещает файловый указатель на заданное количество позиций, производя отсчет от начала файла, от текущей позиции или от конца файла. Функция fseek() именно имитирует произвольный доступ, а не осуществляет его, поскольку для перемещения указателя на требуемую позицию эта функция передвигает его шаг за шагом, а не обращается к символу напрямую, как это происходит при работе с массивом.

Рассмотрим работу функции fseek() на примере файла со следующим содержимым:

.

fseek(myFile, 0, SEEK_SET);

putchar(fgetc(myFile));

fseek(myFile, -1, SEEK_END);

putchar(fgetc(myFile));

fseek(myFile, 20, SEEK_SET);

putchar(fgetc(myFile));

fseek(myFile, -20, SEEK_END);

putchar(fgetc(myFile));

fseek(myFile, 32, SEEK_SET);

putchar(fgetc(myFile));

fseek(myFile, -33, SEEK_END);

putchar(fgetc(myFile));

Константа

SEEK_SET

SEEK_CUR

SEEK_END

Позиция

Начало файла

Текущая позиция

Конец файла

Еще одна полезная функция, относящаяся к произвольному доступу, – это функция ftell(), которая возвращает номер текущей позиции, производя отсчет от начала файла.

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