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