Г. Шилдт - Полный справочник по C++ (1109478), страница 41
Текст из файла (страница 41)
Файловый ввод-вывод ~"4 Функции 1геабо и йище() Для чтения и записи ленных, размер типа которых превышает ! байт, файловая систе- ма языка С содержит две функции: хкевд() и янхзсеО Зги функции позволяют считы- вать и записывать блоки данных любого типа. Их прототипы имеют следующий вид. яххе С Есенин(ззахг) *бибер, яххе с «оличеоево бантов, яххе с кожыеатево (маков, Р1ье "зр) я1хе с кыххсе(сагяс чахсз *(зучзсгз, яххе с количеаглео боденов, яз.хе с колнчеапыо блоков, ЯХЬЕ *зр) В прототипе функции дорепО параметр буфер представляет собои указатель на область памяти, в которую записываются данные, считанные из файла. В прототипе функции дмкхсеО параметр буфер прелставляет собои указатель на область памязи, содержащую данные, которые должны быть записаны в файл Значение параметра количесгяво блоков определяет, сколько блоков подлежит считыванию или записи.
Длина блоков задается параметром количеслзво байтов. (Напомним, что тип яхве с определен как целое число без знака.) В заключение отметим, что указатель яз является указателем на ранее открьпый поток. Функция якеах(О возвращает количество счизанных блоков. Оно может быть меньше параметра количество блоков, если обнаружен конец файла или возникла ошибка. Функция яыкхее() ВозВращаст количество запксанных блоков. Если не произошло никаких ошибок, зто значение равно параметру количестлво блоков. Применение функций й еаза»[» и Мйе(» Если файл бьзл открыт в бинарном режиме, его чтение и запись можно осуществлять с помощью функций якове(() и ямк1се(].
Например, следукзщая программа сначала записывает в фаил, а затем считывает обратно переменные типов ОоиЬ1е, зпс и 1опйс Обратите внимание на то, что в программе используется опера~ар вхвеая, опрелсляющий размер каждого типа данных. у* Записываем данные, не являзсе>зеая аимваламм, на диск и считываем мх обратно. */ Вхоа1иззе <ясбьо.Ь> яхпа1ос)е <ясс(1хЬ.Ь> хпс ыа1п(ча1с)) ( Е1ЬЕ *Ерз г) Ь1е г) = 12.1Зз хпС х = 101; 1апя 1 = 11ЗО1ЗЬз х1((хр=гареп("сеяс", "мЬ+'))==злЛ )) рххпсх("Невозможна открыть файл.зп')з ехз.с(1); хыххсе(йс), яххеах(сзаиЬ1е), 1, гр)з йыххсе(йх, яххеах(хпс), 1, Ер)з еъххсе(й1, яххеае(1апд), 1, гр)з хенхпс)(гр)з Кхеад[йз), яххеаг(даоЬ1е), 1, Йр)з Часть !. Основы языка С++( подмножество С Егеаг((Ы, ятяеоЕ <1пс), 1, Ер) т Етеас)(а1, яьееоЕ<1опд), 1, Ер)т рт[пЕЕ("ВЕ Ъд $1с)", с), 1, 1); Ес1ояе(ЕР)т теецкп От Буфер, как правило, представляе~ собой обычную область памяти, предназначенную для хранения переменных.
В данной простой программе значения, возврашаемыс функциями екеест<) и ямкатеО, игнорируются. Однако в реальных программах эти значения следует анализировать, распознавая возможные ошибки В большинстве случаев функции Якеес) [) и Емт1се О используются лля считывания сложных данных, тип которых опрслелсн пользователем, особенно структур. Например. допустим, что в программе опрелелена следующая структура. ясгцсе яет осе суре ( Е1оае ЬЯ1апсе; с)заг пятое(ВО)т ) совет Слелуюший оператор записывает содержимое переменной еиве в файл, на который ссылается указатель яр. и ентуее(асцяе, я1яеое (яегцсе ястцсе суре), 1, ер) ~~те Функция Веем() и файлы с произвольным доступом Здесь параметр Гр представляет собой указатель файла, возврашенный функцией яореп<).
Параметр смещение указывает количество байтов, на которое следует пере- местить курсор файла от точки. заланной параметром начало. Значение параметра на- чаю задается одним из слслуюших макросов. Начало отсчета Имя макроса Начало Файла Текущая позиция Конец файла ЯЕЕК БЕТ Беек сва ЯЕЕК ЕВЭ Таком образом, чтобы переместить курсор файла, находящийся в начале файла, на количество байтов, заданное параметром сл~ещение, следует применять макрос венк Яет.
Если з.очкой отсчета является текущая позиция курсора, используется макрос Бенк ппи, а если курсор файла установлен на последнюю запись, слелует применять макрос Янек енп. Если функция яяее)е<) выполнена успешно, она возвращает значение О, а если возникла ошибка, возврашается ненулевое значение. Глава 9.
Файловый ввод. вывод С помошью функции Евее)с() можно осушествлять операции авода и вывода данных, используя файлы с произвольным лоступом. Эта функция устанавливает курсор файла в заданную позицию Ес прототип имеет следуюший вил. й Ые Еяее)с(гтье "тр, 1опо Епс смси(ение, Епг ночою) т Слсдуюшая программа иллюстрирует примснснис функции Евее)с(). Она перемешает курсор в заданную позипию указанного файла и отображает байт, записанный в этом месте. Имя файла задается в команднои строке. яфпс1ис)е <зта1а.Ь> яфпс1пйе <зсс)11Ь.Ь> тпс пафп(фпс атдс, сЬат "атду[)) ( КТЬЕ *ср; гс(атдс'=-3) рт1псг("командная страха: БЕЕК имя файла количества байтов>п") ехфС(1)г 11((гр = сореп(атду(1), "тЬ"))==Н(ЛЬ) ртфпсг("Невозможно открыть фас<ге >и"); ехфс(1]; 11(езее)г(гр, асо1(атдгг[2)), Беек Бет)) ( рт1птс("ахамака.>п"); ех1с (1); рт1псс("Б позиции $1с) записан символ Ъс.'гп", аса1(атду[2!), Бесс(тр)); сс1озе(ср)> теснота 0; Функиию двее)с() можно применять лля перемещения на заданное количество байтов, умножая размер соотвстствуюшсго типа на количество элементов.
Допустим, например, что список рассылки састоит из структур, имеющих зип 11вС Суре. Для перехода на десятый адрес, записанный в фаилс, используется слсдуюший оператор. й сзее)г(йр, 9 зтсеой(встпсс 11з» суре), Беек Бет); Текущую позицию фаилового курсора можно определить с помашь>о функции есе11(). Ес протоп1п имеет слсдуюший вид. $ 1апд )пс Есе>1(етье "ф); Данная функция возврашасз.
тскушсс положение курсора файла, связанного с указателем ~р. Если возникла ошибка, ана возврашаст значение — !. Как правило, произвольный досзуп нужен лишь при работе с бинарными файлами. Причина довольно проста. Поскольку текстовые файлы мслут солсржагь управляюшис символы, которые интсрпрстир>ются как команды, количество байтов, на котарос следует выполнить смешение курсора, может нс соответствовать ожидаемому символу. Единственная ситуация, в которой функцию Евее)с() можно применять к текстовым файлам, возникает, лишь если позиция курсора была ранее опрслслсна с помошью функции ЛСе11() и макроса веек БЕТ.
Следует помнить одну важную всш>с фаил, салержаший текст, можно открыть в бинарном режиме. В этом случае на нега нс распространяются ограничения, касаюшисся произвольного доступа к записям текстового файла. Эти ограничсния относятся лишь к файлам, открытым в текстовом рсжил>с.
Часть !. Основы языка С++: подмножество С -"-=~ Функции 1рппЩ) и Ьсап1Ц Кроме уже упомянутых функций ввода-вывода, в языке С предусмотрены функции ерхепее() и евсапе(). эти функции совершенно аналогичны функциям рхепсе() и всапе(), за исключением одного — они работают с файлами. Прототипы функций ерхепее() и евсапе() имею~ следуюший вид.
Епс ЕрхЕпсЕ (РХье *Ер, сопзс сЬах *уяраааяющая сюрака, ... ); хпс Евсапг(РХЬЕ *Ер, сопя" снах уяравтяющая страха, ... ); Здесь параметр ~р представляет собой указатель файла, возврашенный функцией Еореп(). Функции ерхапеЕ() и ЕвсапЕ() выполняют операции ввода-вывода с файлом, на который ссылается указатель/д рассмотрим в качестве примера программу, считывающую с клавиатуры строку и целое число, а затем записываюшую эту информацию в файл с именем ТЕНТ. Затем программа читает этот файл и выводит считанные данные на экран. Проверьте содержимое файла ТЕБТ после выполнения програмл1ы и убедитесь, что его можно понять.
Пример использования функций ЕясапЕ() и ЕрхьпсЕ() */ Вьпс1цс)е <яес]1о.Ь> ()Епс1цс)е <Ео.Ь> ()Епс1цое <зсо1зЬ.Ь> Епс ыатп(чоЫ) ( Р1ЬЕ *Ер~ сЬах в[80]; Епс ЕЕ((Ер/ борея("севе", "и")) == НЦЬЬ) ( рхьпСЕ ( "Невозможно открыть фаГ1л. 1п" ); ехьг (1); ) рх(псЕ("введите строку и целое число: "); Еясапг(ясдгп, "евяо", з, ас); /" считываем даииые с клавиатуры */ Ерхйпсг(гр, "яя яс)", я, с); /* Эаписыааем их в файл */ Ес1ове(Ер); ЕЕ((Ер=гореп! Моеве", "х" ) ) == НПЬЬ) ( рхьпСЕ("Невозможно открыть файл.1п"); ехЕс(1); ЕясапЕ(Ер, "ьяяс)", я, ас); /* считываем даииые из файла */ Ерхйпсг(яес)оце, "Ъя яь)", я, с); /* выводим их иа экран */ хегцхп О; Учтите: хотя функции ЕрхЗпеЕ() и Евсапя() часто обеспечивают наиболее простой способ чтения и записи разнообразных данных, они не вссгла эффективны. Поскольку данные, записанные в файле с помошью формата /хБС11, точно соответствуют своему представлению на экране, каждый вызов этих функций сопряжен с дополнительными расходами.
Таким образом, если скоросп выполнения операций ввода-вывода и размер файла являются критическими параметрами, следует применять функции Ехеа((() и Еитзее(). Глава 9. Файловый ввод-вывод ~ Стандартные потоки В начале выполнения любой программы, написанной на языке С, автоматически открываются три потока: ясМп (стандартный поток вводя), яестоис (стандартный поток вывода) и ясоегг (стандартный поток ошибок).
Обычно эти потоки связаны с консолью, однако операционная систел»а может перенаправлять их на другие устройства. (Перенаправляемые операции ввода-вывода поддерживаются, например, операционными системами ЪУ(пс]овя, г]ОБ, (]пгх и ОЯ/2.) Поскольку стандартные потоки представляют собой указатели файлов, их можно использовать для консольного вволл-вывода.
Например, функцию росс)заг() можно определить слелуюшим образом. в 1пс рисспах(спас с) ( хесихп росс(с, ясс]сес) г Как правило, поток яеохп используется для ввода с клавиатуры, а потоки всооие и асдегг используются для записи на экран дисплея. Потоки ясозп, яеаоие И всдегг можно применять как файловые указатели в любой функции, используклцсй указатели типа вил*. Например, функцию яаесаО можно применять для ввода строки с консоли, используя следуюший вызов. снях. ясх(255]; Говея(зсх, 80, яхс(1п); Фактически такое использование функции свеса() довольно полезно.