Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 42
Текст из файла (страница 42)
Двоичный режим больше подходит для неотформатированных файлов, о которых в этой главе будет рассказано позже. 1. В представленной ниже программе создается файл для вывода, туда записывается информация, и файл закрывается. Затем файл снова открывается уже в качестве файла для ввода, и записанная ранее информация отгула считывается: Гбпс(пс1е <)ок)геагп> ()тпс1ис(е <йзпгеагп> итйпя пагпевраее зпс); )п( тпатп () ( оЕзгтеагп $оыП("Пезпп)у // создание файла для вывода И (!толе) ( соыс « "Файл открыть невозможно1п"; гелыгп 1; 1оиГ « "Привет)1п"; йод~ « 100 « ' ' « Ьех сс 100 << епс(1; 1опп .
с1озе( ); 1тзйтеа~п Ип ("йезсп); // открытие файла для ввода 1г(!тьп) ( соыс « "Файл открыть невовможно1п"; ге(и гп 1; с)так зев (801 (пс лЫ» век » 1; соыг « всг « ' ' <с 1 « еп61; Етп. с1озе () егцгп 0; Само)тчитепь С+~ После того как программа завершится, проанализируйте содержимое файла (ев(. Оно будет следующим: П(>ивет! 100 64 Как уже установлено, при использовании операторов << и >> для реализации файлового ввода/вывода, информация форматируется так же, как если бы она находилась на экране. 2. Рассмотрим другой пример файлового ввода/вывода.
В этой программе введенные с клавиатуры строки считываются и записываются в файл. Программа завершается при вводе знака доллара 3 в качестве первого символа строки. Для использования программы в командной строке задайте имя файла для вывода. Гт)пс1ит)е <ьовсгеаттт> ((1пс1пае <Гвсгеата> пвтпа патпеарасе втд; тттт арпа)п(тпт агяс, с)таг *аг~2л(1) Г(атас! =2) соис « "введите <татя Файла>хп" геГлгп 1; ода1геатттоттс (аггттт(11 ); // Файл для. вывода 1~ (! оттг.) ( соттс « "Файл открыть иевовттоткно'тп" т тетпгп 1; сваг аег(80)т соттс « Вводите строки; для окончания ввода введите дэтт"; йо ( соцс « сз гт » в"гт оттс « лсг « епс(1( иМ.1е (~асг != '3'); оп<. с1оае () гев тгп О; 3. В следующей программе копируется текстовый файл и при этом пробелы превращаются в символы [.
Обратите внимание, как для контроля конца файла для ввода используется функция ео((). Также обратите внимание, как Главе 9. Дополнительные возможности вводе/выводв в С++ поток ввода Вп воспринимает сброс флага вИртуа. Это предотвращает пропуск пробелов в начале строк. // Превращение пробелов в вертикальные линии й(пс!ит(е <тов1леага> Ш и с1тн(е < бите апт > пв(па патпеарасе в1<(; (пт пааво(1пк атас, с(тат *атдт[) ) ( 1т (атаке!=3) ( оопп << "преобразоватл<е <файл ввода> <файл вывода>'1п"; тесптп 1; 1Гв1сеав Нп(адат[1) ) ; // открытие Файла для ввода одвт.сеата Гоцу (адов[2)) р // создание файла для вывода 1Е(!опл) ( сопв « "Файл открыть невозможно~п"т тесптп 1; гб(! й'и) ( сопл « "Файл открыть невозможно~в*' „. есп сп 1; сват с1Ы гп.ппвест(гоа:: вЫрыв); // не пропускать пробелы н).~ 1е (! г1п, ео-() ) Йтт»с(з; тл(сн =' ') св = 1 б(! Г1п. вот () ) (он( « с)т; Гтп.с1оее() т аонк.с1оае (); пелппп Ср 4.
Между исходной библиотекой ввода/вывода С++ и библиотекой ввода/вывода современного стандарта Яапг(агд С++ имеются некоторые отличия, которые необходимо учитывать при модернизации старых программ. Во-первых, в исходной библиотеке ввода/вывода С++ у функции ореп(') имеется третий параметр, задающий режим зашиты файла. По умолчанию это режим обычного файла. В современной библиотеке С++ указанный параметр не поддерживается. Во-вторых, при работе со старой библиотекой для открытия потока ввода/вывода Ыгеав) необходимо явно указать значения режима открытия файла Самоучитель С+-~ 282 юк 1п и 1пзноШ. Значения режима открытия файла по умолчанию не поддерживаются.
Это относится как к конструктору класса Ыгеат, так и к функции прево. Например, при работе со старой библиотекой ввода/вывода С++, чтобы открыть файл для ввода и вывода с помощью функции преп(), необходимо использовать следующую конструкцию: га беата гауасгеаап гауза ееааь орен ("сеа1", Ьоа:: 1п 3 1оа:: оцс1; В современной библиотеке ввода/вывода С++, если режим открытия файла не указан, любой объект типа Ыгеат автоматически открывает файл для ввода и вывода. И последнее. При работе со старой библиотекой ввода/вывода к ошибке выполнения функции орем() ведет значение режима открытия файла, равное ювппопсгеа1е, если указанный файл не существует, или равное ювппогер1асе, если, наоборот, указанный файл уже существует.
В стандарте огапс1агд С++ данные значения режима открытия файла не поддерживаются. файла. Эта программа выводить на экран по- того, которое выводит- 1. Напишите программу для копирования текстового должна подсчитывать число копируемых символов и лученный результат. Почему это число отличается от ся при просмотре списка файлов каталога? 2. Напишите программу для заполнения информацией файле р)юпе.
следующей таблицы в Исаак ньютон, 415 555-3423 Роберт Годдард, 213 555-2312 Энрико Ферми, 202 555-1111 3. Напишите программу для подсчета числа слов в файле. Для простоты считайте, что словом является все, имеющее с двух сторон пробелы. 4. Какие действия выполняет функция 1а преп? 9.3. Неформатируемый двоичный ввод/вывод Хотя текстовые файлы (т.
е. файлы, информация в которых представлена в кодах АКСП, — примеч. лер.) полезны во многих ситуациях, у них нет гибкости неформатированных двоичных файлов. Неформатированные файлы содержат те самые исходные или "сырые" двоичные данные, которые непосредственно используются вашей программой, а не удобный для восприятия АЙВЗ Глава 9. Дополнительные возможности ввода/вывода в Сь~- человека текст, данные для которого транслируются операторами « и ».
Поэтому о неформатируемом вводе/выводе иногда говорят как о "сыром" (гап') вводе/выводе. В С++ для двоичных файлов поддерживается широкий диапазон функций ввода/вывода. Эти функции дают возможность точно контролировать процессы считывания из файлов и записи в файлы. На нижнем уровне двоичного ввода/вывода находятся функции ре(о и рн((). С помошью функции-члена рнт() можно записать байт; а с помощью функции-члена ре(() — считать. Эти функции являются членами всех потоковых классов соответственно для ввода и для вывода.
Функции ре(О и рнЦ) имеют множество форм. Ниже приведены их наиболее часто встречающиеся версии: з а~театп гзуе~ ( сна асиьжол); оаегеат арпа 1сьаг окпвол); Функция цегО считывает один символ из связанного с ней потока и передает его значение аргументу символ. Ее возвращаемым значением является ссылка на поток.
При считывании символа конца файла функция возвратит вызывающему потоку значение (а1зе. Функция рното записывает символ в поток и возвращает ссылку на поток. Для считывания и записи блоков двоичных данных используются функции геайО и жгло, которые также являются членами потоковых классов соответственно для ввода и для вывода. Здесь показаны их прототипы: 1вггеаюп Пгеас$(сиат *буОер, зсгеатв~пв ~спело оайа); ов1геатп Лч тнс(сопзт сЬаг *буфер, в1геаипаые впало оайе) т Функция геайо считывает из вызывающего потока столько байтов, сколько задано в аргументе число бийш и передает их в буфер, определенный указателем буфер.
Функция ип$еО записывает в соответствующий поток из буфера, который определен указателем буфер, заданное в аргументе число бойе число байтов. Значения типа Мгеаиыие представляют собой некоторую форму целого. Если конец файла достигнут до того, как было считано число байт символов, выполнение функции геайО просто прекращается, а в буфере оказывается столько символов, сколько их было в файле. Узнать, сколько символов было считано, можно с помощью другой функции-члена ~сонно), прототип которой приведен ниже: а1геатпв)ке даоппс0 т Функция возвращает количество символов, считанных во время последней операции двоичного ввода. Естественно, что при использовании функций, предназначенных для работы с двоичными файлами, файлы обычно открывают в двоичном, а не в тек- 284 Самоучитель Сч-+ стовом режиме. Смысл этого понять легко, значение режима открытия файла 1ов::Ь(вагу предотвращает какое бы то ни было преобразование символов.
Это важно, когда в файле хранятся двоичные данные, например, целые, вешественные или указатели. Тем не менее, для файла, открытого в текстовом режиме, хотя в нем содержится только текст, двоичные функции также вполне доступны, но при этом помните о возможности нежелательного преобразования символов. 1. В следуюшей программе на экран выводится содержимое файла. Используется функция яе1(). ()1пс1пг(е <: ояггеатп> Ыпс!иг(е <Гяггеаж> иа1пя пагпеарасе атг(; (пг гаавп(1пг агяс, спаг агут(11 с)таг суи 1й(агпс!=2) сопг « "Содержимое: <имя файла>Хп"; гепигп 1; в~яггеал 1п(агут(1(, 1оя::1п ( 1оя: пбапагу) 1й (! 1п) ( « "Файл откоыть иеаоэможиоХп"; ге пгп 1; иМ1е(!1п.еоХ()) 1п.пес(сл); сод(. « сй; 1п.с1ояе(); геспгп О; 2.
В данной программе для записи в файл вводимых пользователем символов используется функция рв1(). Программа завершается при вводе знака доллара 3. ((1пс1пг(е <1оя гаага> 41пс1псе <Еяггеагп> ияьпд паиеярасе ягс(; ) лава 9. Дополнительные возможности ввода/вывода в С++ 285 1пс па1п (1пь агяс, с)заг *агдл[) ) ( с)заг с!н 1Х(агдс!=2) сонГ « Запись: <имя файла>~п"; гегнгп 1; ойзс еап~ огас(агд~[ ), 1сз::онс 1 1оа::)>1пагу); 11 (!опв) сонь « "Файл открыть невозможно1п"г гегнгп 1; сонг. « "Лля остановки введите си>лзол 01п"; сю ( сонг « с1п.дел(с)з); Онс. РШ (Сп) 1 ) ы)т11е (сп)='> '); оцс.с1ове (); геслгп Ор Обратите внимание, что для считывания символов из потока с[п в программе используется функция вето.
Это предотвращает игнорирование начальных пробелов. 3. В следующей программе для записи строки и числа типа доиЫе в файл 1евт используется функция %ИеО: ()1пс1нсе <1овггеага> ()1пс1нг(е <Гвегеагл> $1пс1пс(е <сз1ппя> на[ля паг~еарасе з1с(; (пг пта(п () о1ьзгеа~п онг("Гевс", 1оз::ось 1 1ов".:)>1пагу) 1Г(! онь) ( соле « "Оайл открыть невозможно',и"; ге~нгп 1; оонЬ1е лига = 100.451 с)заг з(гЦ = "Это проверка"; Самоучитель Сч ч опт. ыт1Те ( (с)лат *) апшн, зькеоГ (с(оп)>1е) ) ) опт ют1се (зстг зсл1еп (зла) ); опт.. с1озе () ) те~ш:и О; и ~$"))и" <<<-' Приведение типа к (сйаг') при вызове функции мггйео необходимо, если буфер вывода не определен как символьный массив. Поскольку в С++ осуществляется строгий контроль типов, указатель на один тип не преобразуется автоматически в указатель на другой тип.