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