|
Программирование >> Расширенная версия языка c++
Таким образом, все, что вы уже узнали выводе, вполне применимо и к файлам. Естественно, что обработка файлов предполагает и кое-что новое. Дж реализации файлового ввода/вывода, необходимо включить в программу заголовок <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- Вся информация в файле хранится в том же формате, как если бы она находилась на экране. Следовательно, файл, созданный с помощью оператора <<. представляет из себя файл с отформатированным текстом, и
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |