Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Моя первая программа на С++.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

R Указывает на то, что будет выполняться

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

w Указывает на то, что будет выполняться запись данных на диск или вывод на принтер. Если файл к этому моменту не существует, операционная система создаст его. Если файл уже существует на диске, вся записанная в нем

на данный момент информация будет уничтожена. a Указывает на то, что следует добавить

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

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

Например, если вы хотите создать файл с именем CD.DAT для хранения картотеки коллекции компакт- дисков, вы должны использовать следующие инструкции:

FILE *cdfile;

cdfile = fopen("CD.DAT", "w");

Если в программе требуется осуществить чтение из файла, а не запись в него, используйте следующую запись:

FILE *cdfile;

cdfile = fopen("CD.DAT", "r");

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

Если вы хотите распечатать информацию о вашей коллекции на принтере, используйте следующую по- следовательность инструкций:

FILE *cdfile;

cdfile = fopen("PRN", "w");

Учтите, что вывод информации на принтер возможен только с режимом доступа "w".

Как Си/Си++ работает с файлами

Си сохраняет сведения о текущей позиции чтения и записи в файле, используя специальный указатель.

При чтении информации из файла, указатель определяет следующие данные, которые должны быть счи- таны с диска. Когда файл открывается впервые с использованием режима доступа "r", указатель помеща- ется на первый символ файла. При выполнении очередной операции чтения, указатель перемещается к следующей порции данных, которые должны быть прочитаны. Величина шага перемещения при этом за- висит от количества информации, которая считывается за один прием (рис.12.4). Если за один раз считы- вается только один символ, указатель передвинется на следующий символ, если читается целая структу- ра, указатель перейдет на следующую структуру. Как только вся информация прочитана из файла, указа- тель попадает на специальный код, называемый символом конца файла*. Попытка продолжения чтения после достижения конца файла приведет к ошибке выполнения.

Рис. 12.4. Указатель сохраняет сведения о текущей позиции в файле

Если файл открывается с режимом доступа "w", указатель также помещается в начало файла, так что пер- вые введенные данные будут помещены в начало файла. При закрытии файла после введенного массива данных будет добавлен символ конца файла. Если файл к моменту его открытия с использованием режима доступа "w" уже существует, все содержащиеся в нем данные затираются и «поверх» них записывается новая информация, введенная с помощью процедуры записи. Любые данные, которые могут остаться не уничтоженными, располагаются после нового символа конца файла, так что к ним уже нельзя будет обра- титься при следующем чтении данных из файла. Таким образом, любая попытка записи данных в сущест- вующий файл с использованием режима доступа "w" приведет к уничтожению хранящейся в нем на дан- ный момент информации. Это произойдет даже в том случае, если файл будет просто открыт и закрыт, без записи каких-либо данных.

Если файл открывается с использованием режима доступа "a", указатель помещается на символ конца файла. Новые данные, которые записываются в файл, размещаются после уже существующих данных, а затем добавляется символ конца файла.

  • Наличие символа конца файла на самом деле вовсе не является обязательным.(Прим.ред.)

Как избежать ошибок выполнения

Иногда возникает ситуация, в которой операционная система не может открыть файл, указанный в функ- ции fopen(). Причиной этому может быть отсутствие места на диске. Не исключена и возможность того, что указанный файл просто не существует. Возможна также ситуация, когда вы пытаетесь распечатать данные на принтере, а принтер не включен, или в нем отсутствует бумага.

Если вы попытаетесь использовать файл, который нельзя открыть, программа остановится в результате ошибки выполнения. Чтобы избежать подобного аварийного выхода из программы, можно использовать инструкцию if, которая будет останавливать программу в случае невозможности открытия файла. С помо- щью следующих инструкций, использующих if, можно открыть файл и проверить, действительно ли он от- крыт:

if ((cdfile = fopen("CD.DAT", "w")) == NULL)

{

puts("Невозможно открыть файл"); exit();

}

NULL— это специальное значение, определенное в файле заголовков STDIO.H. Если произошла ошибка и открыть файл невозможно, система вернет значение NULL вместо адреса файловой структуры, и выполне- ние программы прекратится. Аналогичное условие можно внести и в инструкции печати информации на принтере: if ((cdfile = fopen("prn", "w")) == NULL) { puts("Включите принтер и запустите программу сно- ва"); exit(); }

Если принтер не включен, на экране появится сообщение о том, что надо включить принтер, а затем за- пустить программу еще раз. Можно использовать и цикл while, с тем чтобы дать пользователю возмож- ность исправить ошибку:

while ((cdfile = fopen("prn", "w")) == NULL)

{

puts("Включите принтер и нажмите Enter"); flag = getchar();

}

Заметьте, что в некоторых системах нет необходимости в подобных сообщениях. Если принтер не готов к печати, операционная система выведет на дисплей собственное сообщение, предлагающее пользователю либо остановить выполнение операции (abort), либо попробовать повторить ее еще раз (retry). При появ- лении такого сообщения следует включить принтер и нажать клавишу R, чтобы повторить попытку вывода на печать.