Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Строковые потоки предназначены для работы с данными, хранящимися в оперативной памяти. Работа со строковыми потоками будет рассмотрена позднее




Чтение данных из потока называется извлечением, а их запись – помещением в поток. Для увеличения скорости передачи данных используется механизм буферизации: данные помещаются или извлекаются в специальную область памяти – буфер, а физический обмен данными происходит по заполнению/опустошению буфера.

Поток представляет собой последовательность примитивов ввода-вывода и реализован с помощью шаблонов, где в качестве параметра шаблона задается тип примитива charT. С помощью оператора typedef описаны потоки для типов char и wchar_t. В рамках настоящей темы будем рассматривать реализацию потоков для типа char и, следовательно, считать, что поток представляет собой последовательность символов.

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

Потоковый ввод-вывод

ЛЕКЦИЯ 19

Ввод-вывод блоками используется бинарными потоками.

Блочный ввод-вывод Блоком называется область оперативной памяти, содержимое которой записывается в байтах

Запись блоков в файл:
size_t fwrite (const void* ptr, size_t size, size_t nitems, FILE* stream);

где ptr указывает на блок памяти, который записывается в файл;
длина блока указывается как size*nitems
(здесь ‘*’ знак умножения)
. Функция возвращает число записанных единиц. В случае удачи это число должно быть равно nitems.

Чтение:
size_t fread(void* ptr, size_t size, size_t nitems, FILE* stream);

Параметры имеют то же смысл, что и в fwrite.

Пример 18.4. Создание бинарного файла
void CreateBinFile (void)
{struct emp
{ int code;
char name[20];
}
FILE* out;
struct emp s;
if(!(out=fopen("z.bin","wb")))
{ printf("Open file failed.\n");
return;

}

printf("Input code,name.\n");
printf("Press Ctrl+z to exit.\n");
printf("1. ");
int i=2;
scanf("%d%s",&s.code,&s.name);

while (!feof(stdin))
{ fwrite(&s,sizeof(struct emp), 1, out);
printf("%d. ",i);
i++;
scanf("%d%s“,&s.code, &s.name);
}
fclose(out);

}

Пример 18.5. Чтение бинарного файла

void ReadBinFile(void)
struct emp
{ int code;
char name[20];
};
FILE* in;
struct emp s;
unsigned i;

if(!(in = fopen("z.bin", "rb")))
{ printf("Open file failed.\n");
return;

}
fread(&s, sizeof(struct emp),1, in);
do
{ printf("\tcode = %d name = %s\n", s.code, s.name);
fread(&s, sizeof(struct emp), 1, in); }
while (!feof(in));
fclose(in);}

Потоковые классы

Реализация механизма потоков выполнена средствами ООП, а потоковые классы и связанные с ними операции и функции представляют собой часть стандартной библиотеки классов.

Потоки можно классифицировать по следующим критериям:

по направлению обмена данными – на входные, выходные и двунаправленные;

по виду внешних устройств – на стандартные, файловые и строковые:

стандартные потоки предназначены для передачи данных от клавиатуры и на экран дисплея;

файловые – для обмена информацией с файлами на внешних носителях;

Ввод-вывод данных с использованием потоков может быть форматированным или неформатированным. В первом случае используются перегруженные операторы >> и <<, которые позволяют помещать в поток и извлекать из потока данные любых типв, в том числе и пользовательских. Во втором случае (неформатированный ввод-вывод) никакого преобразования данных не происходит, и работа с потоками во многом напоминает уже описанную ранее работу с файлами.

· ios – базовый класс для всех потоков;

· istream, ostream, iostream – классы для стандартных потоков;

· ifstream, ofstream, fstream – классы для файловых потоков;

· istringstream, ostringstream, stringstream – классы для строковых потоков.


Форматированный ввод-вывод
Для форматированного ввода-вывода используются перегруженные операторы >> и <<. Суть работы оператора << состоит в следующем: данные преобразуются в последовательность символов, которая и заносится в выходной файл. Так, целочисленные данные (типы int, long и т.д.) могут быть преобразованы к одной из систем счисления (десятичной, восьмеричной или 16-ричной).

Числа с дробной частью (float, double и т.д.) выводятся только в десятичной системе счисления, но могут быть представлены в фиксированной и экспоненциальной форме. Символы (тип char) и строки (т.е. данные типа char *) выводятся в соответствии с принятой кодировкой (в консольных приложениях – это т.н. кодировка OEM, соответствующая кодовой странице 866).
Для разделения пробелом двух строк можно записать как конструкцию
cout << s1 << ’ ’ << s2;
так и
cout << s1 << ” ” << s2;

Оператор >>, наоборот, анализирует последовательность данных во входном потоке и в случае правильной интерпретации преобразует данные во внутреннее представление того типа, который указан в качестве второго операнда. При этом разделителями между операндами является, среди всего прочего, и пробел, и, как следствие, возникают вопросы при вводе строк: окончанием строки является не нажатие клавиши Enter, а первый встреченный пробел. Для решения этой проблемы можно использовать неформатированный ввод.

Флаги можно устанавливать с помощью функции setf(), а сбрасывать - с помощью функции unsetf().

В составе класса ios определены поля:

long x_flags, содержащее набор битовых флагов, каждый из которых отвечает за тот или иной режим ввода-вывода и имеет свое имя, определенное в классе ios;
int x_width – минимальная ширина вывода (по умолчанию – 0);
int x_precision – количество цифр в дробной части при выводе с фиксированной точкой или число значащих цифр при выводе в экспоненциальной форме (по умолчанию – 6);
char x_fill – символ-заполнитель поля вывода (по умолчанию - пробел).
Поля x_flags, x_fill и x_precision, будучи один раз установленными, остаются таковыми до следующего явного изменения. Однако значение поля x_width сбрасывается в ноль после каждого нового вывода.

Флаги форматирования
skipws
-при вводе пробельные литеры пропускаются;
left - выводимые данные выравниваются по левому краю с дополнением символами-заполнителями по ширине поля;
right - выводимые данные выравниваются по правому краю с дополнением символами-заполнителями по ширине поля (установлен по умолчанию);

internal - знак числа выводится по левому краю, а само число – по правому краю.
Промежуток между знаком и цифрами заполняется символом x_fill;
dec
-целые числа выводятся по основанию 10 (установлен по умолчанию); устанавливается также манипулятором dec;
oct
-целые числа выводятся по основанию 8; устанавливается также манипулятором oct;
hex -целые числа выводятся по основанию 16; устанавливается также манипулятором hex;

boolalpha - перевод логического 0 и 1 соответственно в false или true;
showbase
-при выводе целых чисел отображается префикс, указывающий на основание системы счисления;
showpoint - при выводе чисел с плавающей запятой всегда отображается десятичная точка, а хвостовые нули не отбрасываются;
uppercase - шестнадцатеричные цифры от А до F, а также символ экспоненты Е отображаются в верхнем регистре;
showpos -при выводе положительных чисел отображается знак плюс;
scientific -числа с плавающей запятой отображаются в научном формате (с экспонентой);
fixed -числа с плавающей запятой отображаются в фиксированном формате (без экспоненты);
unitbuf -при каждой операции вывода буфер потока должен очищаться;
stdio -при каждой операции вывода буферы потоков stdout и stderr должны очищаться.

Форматирующие методы
Для доступа к полям форматирования могут быть использованы следующие методы класса ios.


long flags(long);
Этот метод устанавливает значение поля x_flags, например:
cout.flags(ios::fixed|ios::left);
//остальные флаги сброшены

long setf(long);

Этот метод устанавливает флаги, указанные в параметре и не меняет остальные, например:

cout.setf(ios::fixed|ios::left);




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 366; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.014 сек.