X-PDF

Функции вывода put и write

Поделиться статьей

Для вывода двоичных данных или отдельного символа можно использовать функцию-компонент put, объявленную в ostream следующим образом:

ostream ostream::put (char ch) .

При объявлении int ch=x . следующие две строки эквивалентны:

cout.put(ch) .

cout &lt .&lt . (char)ch .

Функция-компонент write позволяет вывод больших по размеру объектов:

ostream&amp . ostream::write(signed char* ptr, int n) .

ostream&amp . ostream::write(unsigned char* ptr, int n) .

Функции write выводят n символов (включая любые входящие пустые символы) в двоичном формате. В отличие от строковой вставки, write не прекращает работу, встретив пустой символ.

Например,

int x . char s[12] .

cout.write((char *)&amp .x, sizeof(x)) .

cout.write(s,sizeof(s)) .

пошлет не преобразованное представление х и s на стандартное устройство вывода.

Существует тонкое различие между форматированной операцией &lt .&lt . и неформатированными функциями put и write. Форматированная операция может вызвать очистку связанных потоков и иметь атрибут ширины поля. Неформатированные операции не обладают этими свойствами. Поэтому cout &lt .&lt . a и cout put(a) могут давать разные результаты. Все флаги форматирования применимы к &lt .&lt ., но ни один из них не применим к put или write.

Пример: В файл, открытый в текстовом режиме, дважды записывается одна и та же строка: первый раз – посимвольно . второй – вся строка целиком.

#include &lt .fstream.h&gt .

#include &lt .string.h&gt .

#define n 40

main()

{ int i=0 .

Представленная информация была полезной?
ДА
59.46%
НЕТ
40.54%
Проголосовало: 1157

char str[n]=Записываемая строкаn .

ofstream fstr(ofstream.out) .

while(str[i]!=)

{fstr.put(str[i]) .

cout&lt .&lt .nПозиция маркера записи: &lt .&lt .fstr.tellp() .

i++ .}

fstr.write(str,strlen(str)) .

cout&lt .&lt .nНовая позиция маркера записи: &lt .&lt .fstr.tellp() .

fstr.close() .

}

Результат:

Позиция маркера записи: 1

Позиция маркера записи: 2

… … …

Позиция маркера записи: 19

Позиция маркера записи: 21

Новая позиция маркера записи: 42

При выводе данных в файл, открытый в текстовом режиме, автоматически выполняется преобразование n = CR/LF, т.е. символ новой строки преобразуется в пару символов возврата каретки и перевода строки. При чтении происходит обратное преобразование. Именно поэтому наблюдается “скачок” счетчика: после 19 идет 21. Функция put(), записывающая в файл n, на самом деле помещает в файл два других символа. Функция write() выполняет такое же преобразование, поэтому конечное число счетчика равно 42, а не 41.

Если в данной программе указать не текстовый, а двоичный файл

ofstream fstr(ofstream.out, ios::binary) .

то такого “скачка” счетчика наблюдаться не будет, т.к. не происходит замены символа новой строки в пару символов возврата каретки и перевода строки.


Поделиться статьей
Автор статьи
Анастасия
Анастасия
Задать вопрос
Эксперт
Представленная информация была полезной?
ДА
59.46%
НЕТ
40.54%
Проголосовало: 1157

или напишите нам прямо сейчас:

Написать в WhatsApp Написать в Telegram

ОБРАЗЦЫ ВОПРОСОВ ДЛЯ ТУРНИРА ЧГК

Поделиться статьей

Поделиться статьей(Выдержка из Чемпионата Днепропетровской области по «Что? Где? Когда?» среди юношей (09.11.2008) Редакторы: Оксана Балазанова, Александр Чижов) [Указания ведущим:


Поделиться статьей

ЛИТЕЙНЫЕ ДЕФЕКТЫ

Поделиться статьей

Поделиться статьейЛитейные дефекты — понятие относительное. Строго говоря, де­фект отливки следует рассматривать лишь как отступление от заданных требований. Например, одни


Поделиться статьей

Введение. Псковская Судная грамота – крупнейший памятник феодального права эпохи феодальной раздробленности на Руси

Поделиться статьей

Поделиться статьей1. Псковская Судная грамота – крупнейший памятник феодального права эпохи феодальной раздробленности на Руси. Специфика периода феодальной раздробленности –


Поделиться статьей

Нравственные проблемы современной биологии

Поделиться статьей

Поделиться статьейЭтические проблемы современной науки являются чрезвычайно актуальными и значимыми. В связи с экспоненциальным ростом той силы, которая попадает в


Поделиться статьей

Семейство Первоцветные — Primulaceae

Поделиться статьей

Поделиться статьейВключает 30 родов, около 1000 видов. Распространение: горные и умеренные области Северного полушария . многие виды произрастают в горах


Поделиться статьей

Вопрос 1. Понятие цены, функции и виды. Порядок ценообразования

Поделиться статьей

Поделиться статьейЦенообразование является важнейшим рычагом экономического управления. Цена как экономическая категория отражает общественно необходимые затраты на производство и реализацию туристского


Поделиться статьей

или напишите нам прямо сейчас:

Написать в WhatsApp Написать в Telegram
Заявка
на расчет