|
Программирование >> Аргументация конструирования
Функция открывает фай OTEMNT, конструируя объект teraent. Если такого файла не существует, этот объект не создается (ведь если вы ожидаете получить какую-то информацию из этого файла, бессмысленно создавать новый пустой файл). Если объект неправилен (например, файл не существовал), функция выводит сообщение об ошибке и завершается. В противном случае функция выполняет считывание пар переменного tNumbe г Mrawal, пока файл не закончится (bankstatement .eofO == true). Попытка прочитать информацию с помощью объекта класса ifstream с установленным флагом ошибки приведет к немедленному возврату без считывания чего-либо. Для сброса флага ошибки используйте функцию clear (). Класс fstream похож на комбинацию классов ifstream ream (кстати, он и наследуется от обоих этих классов). Объект класса fstream может быть создан как для ввода, так и для вывода. JloqKxaccH stystyeam Классы и strstream определены в заголовочном файле с именем strstrea.h или strstream.h. Операционная система MS DOS ограничивала имена файлов восьмью символами с трехбуквенным расширением; другими словами, использовала имена в формате 8.3 DOS. Это ограничение ушло в историю, однако многие компиляторы, включая Visual C + + , придерживаются совместимости с именами типа 8.3 и используют имя strstrea.h. Компилятор GNU C++ использует полное имя Классы из позволяют использовать операции, определенные для файлов в классах fstream, для строк в памяти. Это очень похоже на функции sprintf () и sscanf О в С. Приведенный ниже фрагмент кода использует поток ввода для разбора передаваемой функции строки. Если это компилятор Visual С++ или подобный #ifdef WIN32 ...использовать имя типа 8.3... fiinclude <str3trea.h> . ..3 противном случае.. . #else полное имя #include <strstreani. h> #endif parseString - демонстрирует классы строчных потоков, считывая переданный буфер, как если бы это был простой файл char* parseString (char*- pString) ( istrstream inp(pString, 0); int accountNumber; float balance; inp >> accountNumber >> balance; char* pBuffer = new char[12B]; ostrstream out(pBuffer, 128); oux Номер счета = << accountNumber , баланс = $ balance; return pBuffer; Пусть для определенности pstring указывает на строку 23100 . 0 . Объект inp связывается со строкой с помощью конструктора Второй аргумент конструктора -- длина строки. В нашем примере этот аргумент равен О, что означает читать, пока не будет достигнут конец строки . Обьект out для вывода связан с буфером, на который указывает p5uffer. Второй аргумент конструктора в этом случае также представляет собой размер буфера. Третий аргумент относится к режиму работы потока, который по умолчанию равен ios: : out. Конечно же, вы можете установить этот аргумент равным ios: :ate, если хотите дописывать информацию в буфер, вместо того чтобы переписать его. Фрагмент кода, отвечающий за ввод, записывает зпачение 1234 в цеременную ас-countNumoer и значение 100 в переменную balance. Фрагмент, отвечающий за вывод, дописывает строку Номер счета = в буфер вывода *pBuffer, за которым следует число 1234 из переменной accountNumber, и т.д. В результате выполнения этого кода для данного ввода буфер вывода будет содержать строку Номер счета = 1234, баланс = $100.0 0 Директива #ifdef в начале предыдущего фрагмента кода нужна для того, чтобы подключить правильный заголовочный файл. WIN32 всегда определена, когда программа компилируется Visual C + + , и не определена, если программа компилируется GNU С+ + . Таким образом, когда программа компилируется с помощью Visual С + + , включается файл в противном случае используется файл Еще раз рассмотрите этот фрагмент кода. Если бы потребовалось, чтобы inp и out использовали файлы, в программе следовало бы изменить только конструкторы. В остальном программа б]ла бы неизменной. Работа с буфером памяти, по сути, ничем не отличается от работы с внешним файлом. MoHUHifjUifioaHue MOHumfXSiftaMU Обычно потоки ввода-вывода для выведения чисел и символов используют формат по умолчанию, который оказывается вполне подходящим для решения большинства задач. Однако мне страшно не понравилось, когда общая сумма в моей любимой программа TOGET б1л дсна как 249.600006 вместо ожидаемого 249.6 (а еще лучше - 249.60). Необходимо каким-то образом указать программе количество выводимых цифр после десятичной точки. И такой способ есть; более того, в C++ он не единственный. В зависимости от установок по умолчанию вашего компилятора, вы можете увидеть на экране 249.6. Однако хотелось бы добиться того, чтобы выводилось именно 249.60. форматом можно управлять с помощью серии функций-членов объекта потока. Например, количество разрядов для отображения можно установить, используя функцию precision() : ttinclude <iostream.h> voi loat interest, float dollarAmount) cout << Сумма в долларах cout.precision{2); cout dollarAinount; cout.precision(4); cout interest << \n ; В этом примере с помощью функции precision (> вывод значения do liar Amount устанавливается с точностью двух знаков после запятой. Благодаря этому вы можете увидеть на экране число 249.60 - именно то, что вы хотели. Затем устанавливается вывод процентов с точностью четырех знаков после запятой. Второй путь связан с использованием так называемых манипуляторов. (Звучит страшновато, не так ли?) Манипуляторы - это объекты, определенные в заголовочном файле iomanip.h, которые приводят к тому же эффекту, что и описанные выше функции-члены (чтобы иметь возможность пользоваться манипуляторами, вы должны не забыть включить iomanip.h в программу). Единственное преимущество манипуляторов в том, что программа может включать их прямо в поток, не прибегая к вызову отдельной функции. Если вы перепишете предыдущий пример так, чтобы в нем использовались манипуляторы, программа будет иметь следующий вид: ifinclude <iostream.h> ttinclude <iomanip.h> void fn (float interest, float dollar.?rt)ount) cout Сумма в долларах - ; << << setprecision(4) interest << Наиболее распространенные манипуляторы и их назначение приведены в табл. 26.4. Таблица26.4.Основныеманипуляторыифункцииуправленияформатомпотока
*Это значение воздействует на вывод одного поля и возвращается к значению по умолчанию. Внимательно следите за параметром ширины поля (функция width (n) либо манипулятор setw(c)). Большинство параметров сохраняют свое значение до тех пор, пока оно не будет изменено новым вызовом, однако для параметра ширины поля это не так. Этот параметр возвращается к значению по умолчанию, как только будет выполнен следующий вывод в поток. Например, не надейтесь, что приведенный ниже фрагмент кода выведет два целочисленных значения длиной в 8 символов.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |