Программирование >>  Расширенная версия языка c++ 

1 ... 87 88 89 [ 90 ] 91 92 93 ... 227


Таким образом, все, что вы уже узнали выводе, вполне применимо и к файлам. Естественно, что обработка файлов предполагает и кое-что новое.

Дж реализации файлового ввода/вывода, необходимо включить в программу заголовок <fstream>. В нем определено несколько классов, включая классы ifstream, ofstream и fstream. Эти классы явжются производными от классов istream и ostream. Вспомните, что классы istream и ostream, в свою очередь, явжются производными от класса ios, поэтому классы ifstream, ofstream и fstream также имеют доступ ко всем операциям, опредежемым классом ios

(это обсуждалось в предыдущей главе).

В C++ файл открывается посредством его связывания с потоком. Имеется три типа потоков: ввода, вхвода и ввода/вхвода. Перед тем как открыть файл, нужно, во-первых, создать поток. Для создания потока ввода необходимо объявить объект типа ifstream. Для создания потока вывода - объект типа ofstream. Потоки, которые реализуют одновременно ввод и вывод,

должны объявляться как объекты типа fstream. Например, в следующем

фрагменте создается один поток для ввода, один поток для вывода и еще один поток одновременно для ввода и для вывода:

ifstream in; ввод

ofstream out; вывод

fstream io; ввод и вывод

После создания потока, одним из способов связать его с файлом является функция ореп(). Эта функция является членом каждого из трех потоковых классов. Здесь показаны ее прототипы для каждого класса:

voi open (const char *имя файла,

openiaode режим = ; : in) ; void ofstream: : open (const char *ямя фаАпа,

opermode режим = ios: : out I ios : : trunc) ; void fatream::open(const char *имя #аяла,

Openmode режим = ios: : in I ios : : out) ;

Здесь файл- имя файла, в которое может входить и спецификатор пути. Значение режим задает режим открытия файла. Оно должно быть значением типа openmode, которое является перечислением, определенным в классе ios. Значение режим может быть одним из следующих:

ios: :арр

ios: : ate \

ios! jbinary ios: :in

ios: :out -J-: - -J

ios: :tri:nc

. i , . ., . I. .1.-:. .. .

Вы можете объединить два или более этих значения с помощью оператора OR. Рассмотрим, что означает каждое из этих значений.



Глава 9. Дополнительные возможности ввода/вывода 277

Значение ios::app вызывает открытие файла в режиме добавления в конец Это значение может применяться только к файлам, открываемым для вывода. Значение ios::ate задает режим поиска конца файла при его открытии. Хотя значение ios::ate вызхвает поиск конца файла, тем не менее, операции

ввода/вывода могут быть выполнены в любом месте файла.

Значение ios::in задает режим открытия файла для ввода. Значение ios::out задает режим открытия файла для вывода.

Значение binary вызывает открытие файла в двоичном режиме. По умолчанию все файл1 открхваются в текстовом режиме. В текстовом режиме имеет место преобразование некоторых символов, например, последовательность символов возврат каретки/перевод строки превращается в символ новой строки. Если же файл открывается в двоичном режиме, такого

преобразования не выполняется. Запомните, что любой файл, независимо от

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

Значение приводит к удалению содержимого ранее существовав-

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

существовавший файл с тем же именем автоматически усекается до нулевой

длины.

В следующем фрагменте для вывода открывается файл test:

ofstream mystream; -t

fflystream.open( test );

В этом примере параметррежи ии ореп() по умолчанию устанавливается в значение, соответствующее типу открываемого потока, поэтому нет необходимости указывать его явно.

Если выполнение функции ореп() завершилось с ошибкой, в булевом выражении поток будет равен значению false. Этот факт можно использовать для проверки правильности открытия файла с помощью, например, такой инструкции:

if(Imystream) {

cout Файл открыть невозможно\п ;

программа обработки обки открытия файла ) .. -v. *..-..-.Г.-

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

Проверить правильность открытия файла можно также с помощью функции is open(), являющейся членом классов ifstream, ofstream и fstream. Ниже показан прототип этой функции:

bOOl is OpenO; i- :



278 Самоучитель С+

Функция возвращает истину, если поток удалось связать с открытым файлом, в противном случае функция возвращает ложь. Например, в следующем фрагменте проверяется, открыт ли файл, связанный с потоком mystream:

if (mystream. is open ()) { . . . ......

cou Файл не открытХп ;

, - .t. г I - . 1 i . . с

... . J . ...

Хотя использовать функции n() для открытия файла в целом правильно, часто вы этого делать не будете, поскольку у классов ifstream. ofstream и fstream есть конструкторы, которые открывают файл автоматически. Конструкторы имеют те же параметры, в том числе и задаваемые по умолчанию, что и функция орел(). Поэтому чаще вы будете пользоваться таким способом открытия файла:

ifstream mystream 1е ) ; открытие файла для ввода

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

Для закрытия файла используйте функцию-член close(). Например, чтобы закрыть файл, связанный с потоком mystream, необходима следующая инструкция:

mystream.close() ;

Функция не имеет параметров и возвращаемого значения.

С помощью функции eof(), являющейся членом класса ios, можно определить, был ли достигнут конец файла ввода. Ниже показан прототип этой функции:

bool eof() ;

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

После того как файл открыт, очень легко считать из него или записать в него текстовые данные. Просто используйте операторы и >> также, как это делалось для консольного ввода/вывода, только замените поток cm или cout тем потоком, который связан с файлом. Так же, как и оператор и для чтения из файла и записи в файл годятся функции С - fprintf() и fscanfO- Вся информация в файле хранится в том же формате, как если бы она находилась на экране. Следовательно, файл, созданный с помощью оператора <<. представляет из себя файл с отформатированным текстом, и



1 ... 87 88 89 [ 90 ] 91 92 93 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика