Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы


Скачать 449.68 Kb.
НазваниеЗадача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы
страница4/6
ТипЗадача
1   2   3   4   5   6

….1

…..2

……3

setprecision( int n) -определяет точность представления числа при вводе –

вывода вещественного числа , количество цифр

дробной части

for(int i =0 ; i< 4; i++) cout<
1.2

1.23

1.234
setw( int n) - параметр задает поле вывода

При использовании манипулятора setw как и член – функции width необходимо указывать требуемую ширину отдельно для каждого выводимого значения.
cout << setiosflags(ios::scientific)<< 0.000123; 1.23e-04
cout << setiosflags(ios::fixed)<< 0.000123; 0.000123
Ввод-вывод для типов, определенных пользователем
Необходимо расширить действие операций >>и << на данные производного типа.

Это делается с помощью операций – функций ( перегрузка операций). Первый параметр операции - функции ссылка на объект класса (поток). Второй параметр - ссылка на объект желаемого типа для ввода или сам желаемый тип для вывода.

Тип возвращаемого результата – ссылка на объект класса, т. е. на поток
Пример Вывод структуры

#include

struct st // объявлена структура

{char* name ; long sh, cen ;}zap1 ={ « ножницы», 1756 , 43};

st A [5];

// перегрузка операции включения в поток:

ostream& operator << (ostream& out , st& zap) //операция- функция для

//вывода структуры на экран

{ out << «\n»<
return out ; }
/*Эквивалентно было написать:

{ return cout << «\n»<// Перегрузка операции извлечения из потока:

istream& operator >> ( istream& in , st & zap) //операция функция для ввода

// с клавиатуры структуры

{ in >> zap.name >> zap. sh >> zap.cen; return in ;}

// вводятся три значения через
/* Или эквивалентно:

{ return in >> zap.name >> zap. sh >> zap.cen;} */
… void main()

{ … for(int I=0; I<5; I++) {cin>> A[I]; cout<< A[I];}

cout<В связи с тем , что операции-функции возвращают ссылку на поток , их можно использовать в цепочке вводов или выводов.

Функции для обмена с потоком

Кроме операций включения >> в поток и извлечения <<из потока имеются альтернативные компонентные функции ввода – вывода.
Функции вывода
В классе выходного потока определены две функции для двоичного вывода данных в стандартный поток:

ostream & ostream::put(char c);
ostream & ostream::write ( const signed char * array, int n);

ostream & ostream::write ( const unsigned char * array, int n);
Функция put (‘ ‘) помещает в выходной поток (объект для которого она вызвана ) символ – параметр:
cout .put(‘ X’) ( аналогично cout<<’X’; )
Первый параметр функции write - указатель array на символьный массив на участок оперативной памяти из которого извлекаются побайтно данные для вывода в поток, параметр n определяет количество выводимых байт.
Флаги форматирования и компонентные функции для форматирования не применимы к функциям put и write. Т.е. в отличии от операции включения в поток << эти функции не обеспечивают форматного вывода, напр., символ выводится всегда в одну позицию потока.
Функции put и write возвращают указатель на объект (поток) , поэтому из них также можно составлять цепочки вывода
char mas[] =”Миру-мир”;

int r = sizeof ( mas) -1;

cout.put(‘\n’) . write (mas , r). put(‘!’) . put(‘\n’);
//Миру-мир!

Функции чтения
Если надо прочитать строку символов, содержащую пробелы, то с помощью операции это сделать не просто – каждое чтение выполняется до пробела, а ведущие левые пробелы игнорируются.

Это легко можно сделать с помощью функций класса istream – функций бесформатного двоичного чтения.

C помощью этих функций читаются данные того потока (объекта), для которого функции вызываются.
Двоичное чтение – это чтение любой информации как последовательность байт. Данные читаются без преобразования.

Напр., если во входном потоке находится представление вещественного числа 1.7E-2, то оно будет воспринято как последовательность из шести байт, и читать эту последовательность с помощью функций двоичного ввода можно только в символьный массив из 7 символов.
1) istream & get (signed char* array, int n , char=’\n’);
2) istream & get (unsigned char* array, int n , char=’\n’) ;
Функции извлекают последовательность n-1 байтов из потока и переносят их в символьный массив (буфер), задаваемый первым параметром. Затем в массив помещается концевой символ ‘\0’.

Если раньше встретился ограничительный символ – третий параметр, то чтение прекращается, сам ограничитель не извлекается из потока, в формируемую строку не переносится, а помещается концевой символ ‘\0’.

Таким образом, массив должен иметь длину не менее n символов. Если встретился EOF, то он воспринимается как ограничительный символ.
3) istream & get (signed char & c);
4) istream & get (unsigned char & c);
Извлекают один символ из потока и присваивают его параметру
5) int get ( ) ;– Возвращает код извлеченного символа, если поток пуст

возвращает код конца файла.


6) istream & getline (signed char* array, int n , char=’\n’);
7) istream & getline (unsigned char* array, int n , char=’\n’);
Аналогичны первым двум функциям, но удаляется из входного потока и символ ограничитель.
8) int peek( ) ;

Возвращает код очередного символа потока (или EOF , если поток пуст)
char ch; while(cin.peek() != ‘\n’) { cin.get(ch) ; cout.put (ch);}
9) istream & putback(char) ;– помещает символ в поток , он и будет

следующим читаемым символом

10) istream & ignore (int n=1 , int m = EOF) ; - позволяет проигнорировать

n символов потока , m -символ ограничитель.
11) istream & read (signed char* array, int n );
12) istream & read (unsigned char* array, int n );
Считывают из потока n символов в массив array
13) istream & seekg ( long pos) ; -устанавливает позицию чтения
14) istream & seekg ( long pos, seek_dir dir) ;

где параметр dir принимает значение из перечисления

enum seek_dir {ios :: beg, ios::cur, ios::end}

pos - относительная величена смещения ( в байтах) указателя во

входном потоке, относительно трех ориентиров.

15) ostream & seekp( long pos) ; - устанавливает позицию записи в поток

16) ostream & seekp( long pos, ios :: beg )

15) long tellg( ); - определяет текущую позицию чтения

16) long tellp( ); определяет текущую позицию записи
Строковые потоки ( обмены в оперативной памяти)

Классы istrstream, ostrstream, strstream предназначены для создания потоков, связанных с участками основной памяти. Такие участки определяются часто как символьные массивы. Объекты (потоки) названных классов называют строковыми потоками.

Определение :

Определяется строковый поток и одновременно связывается с участком ОП с помощью конструктора с параметром (по правилу создания объекта с помощью вызова конструктора с параметрами)
<Имя класса> < имя потока(объекта)> ( параметры конструктора)
Входные строковые потоки (из которых читают) создаются с помощью вызова следующего конструктора
istrstream in (char *str );

параметр str указывает на существующий участок памяти

Пример: char buf [80] ;

istrstream in (buf);
Входной строковый поток in связан с участком памяти, выделенным под массив buf. Теперь используя поток in и операцию >> можно из массива buf считывать значения, в какие либо данные.
Пример:

#include

void main()

// выделяем область памяти для обмена

char*stroka=”1436.7 Auda!”

istrstream instr ( stroka );

char mas[10];

float b;

instr>> b>> mas; //распаковка строки

cout << b << “ “ << mas << endl;
Операция >> извлекает информацию от первого не пробельного символа до первого пробела. Чтобы считывать с пробелами, надо использовать функции get( ) и getline ( ). С помощью этих функций при использовании строковых потоков, можно организовать копирование строк.



char * stroka = “ 1917 \t – год революции “

istrstream instr ( stroka );

char array [80];

instr.getline ( array, sizeof(array) , ‘\0’);

cout<1917 - год революции
Безымянные входные потоки – это создание безымянного объекта

Вызывается конструктор без имени

char* stroka = “ … “

char array [50];

istrstream ( stroka)>>array; // введет до первого пробела

… istrstream ( stroka).getline(array , 50 , ‘\0’)// введет всю строку опять с ее

//начала

Выходные строковые потоки ( связывается с участком ОП для вывода данных) создается вызовом конструктора с параметрами
ostrstream outstr ( char*str, int n , int mod )
Первый параметр адресует существующий участок памяти, куда выводятся данные. Второй параметр определяет размеры этого участка памяти .Третий параметр определяет режим обмена.

ios:: out

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

ios::ate ( ios :: app)

  • позиция записи в месте нахождения символа ‘\0’( продолжение записи)

Пример безымянного выходного строкового потока

#include < strstrea.h>

void main( )

{ char buf [80];

char al [ ]=«\nБез включения разделителей «

char ol [ ] =« текст\n\»сливается\» .\n»

ostrstream ( buf, sizeof(buf) ).write(al , sizeof(al));

ostrstream ( buf, sizeof(buf) , ios :: ate).write(ol , sizeof(ol));

cout << buf<
Без включения разделителей текст

«сливается» .

Функция write( ) вызывается для безымянного потока. Запись идет в массив buf[ ]. Вывод в строку с помощью write идет подряд и без форматирования. Строка al записывается в buf[ ] вместе с пробелами и признаками конца строки. Байтовый ноль в строку переносится. Т.к. длина строки меньше длины буфера, то буфер не заполнится целиком. При создании второго безымянного потока с помощью конструктора , в качестве третьего параметра указывается флаг ios :: ate, что означает, что поток открыт для дополнения. Последняя запись в поток осуществляется, начиная с позиции символа ‘\0’ предыдущей записи, туда адресуется строка ol. Т.е. в buf[ ] запишется результат конкатенации строк, который и выведется на экран последним оператором.
Используем для вывода операцию включения в поток <<.

Будем использовать для разнообразия именованный поток .
…{

ostrstream outstr( stroka, sizeof(stroka), ios::out | ios::ate ) // мода для до-

//полнения строки

outstr<<”\nБез включения разделителей»

<<« текст\n\»сливается\» .\n»

<< 12345<<-4.67<<+1.456<
cout<< stroka;}
Без включения разделителей текст

«сливается» .

12345-4.67 1.456
При создании потока (для дополнения) указатель потока устанавливается на начало потока, а затем перемещается на длину каждой новой записи без промежутков. При использовании операции включения в поток << даже

байтовый ноль ’\0’ в строку-буфер не переносится и его надо добавлять явно, если надо использовать буфер потока(stroka) в качестве строки. Числовая информация, включаемая в поток, форматируется, средства изменения форматов были рассмотрены выше.

Знак “+” заменяется пробелом.
Двунаправленные потоки

Конструктор строковых потоков для чтения и для записи имеет вид:
strstream outstr ( char*buf, int n , int mod )
buf – указатель на участок памяти ( буфер потока);

n – размер в байтах участка памяти
Третий параметр – это дизъюнкция флагов

ios:: in ios::out – определяет направление потока

ios::ate ios app –влияют на размещение указателя позиции чтения или записи в буфере.

Пример 1:

#include

void main ()

{ char buf [100];

char s [80];
// объявляем двунаправленный строковый поток, связанный с массивом buf[]

strstream iostr ( buf, sizeof(buf) , ios:in |ios::out );

iostr<< “Строковый поток связан с участком ОП.” <
//позиция записи сместилась в конец потока, позиция чтения на начале //потока

iostr>>s; cout<<’\n’<< s; // читает до пробела

iostr>>s; cout<<’\n’<< s; // читает следующее слово

// установим позицию чтения на начало потока и прочитаем весь буфер

iostr.seekg ( 0L, ios::beg );

iostr.getline( s, sizeof(s), ‘\0’ ); // копирование из буфера потока buf в s

cout<<’\n’<
Результат:

Строковый

Поток

Строковый поток связан с участком ОП.

Пример 2:

#include

#include

char link[200]; // массив для буфера
strstream obmen ( link, sizeof(link) , ios::in |ios::out );// определение

//двунаправленного потока
struct elem { int nk, nl ; float nz;}; // определена структура
strstream &operator >> (strstream & in , elem & el)// перегрузка операции

{in >> el.nk >> el. nl >>el.nz; return in;} //ввода


ostream &operator << (ostream & out , elem & el)// перегрузка операции

{ out << el.nk <<"\t " << el. nl << "\t " <
// вывода
// функция чтения из потока

void res(void)

{ elem elz; //объявлена структура

int num;

obmen >> num;

cout << num<<'\n';

for(int i=0 ; i< num; i++) { obmen >> elz; cout<
}

void main()

{clrscr();

// char buffer [180];

elem arel[5]={{ 1, 2 ,3.45}, {3, 4 , 4.56},

{5, 6, 5.7}, {7, 8, 7.7 },

{ 9, 10, 7.7}} ;

int k=5;

obmen << k<<" ";

for(int i=0 ; i< 5; i++)

obmen << arel[i];

obmen<
res ( );

}

Результат:

5

1 2 3.45

3 4 4.56



Перегрузка операции включения << для базового потока класса ostream наследуется производным классом strstream для строковых потоков. Поэтому дополнительно для строковых потоков перегружать эту операцию не надо.
Работа с файлами
Информация во внешней памяти сохраняется в виде файлов – именованных участков внешней памяти (жесткого диска, гибкой дискеты, электронного виртуального диска). Файлы позволяют сохранять информацию при отключении компьютера (в отличие от ОП). Под файлом понимают также логическое устройство – потенциальный источник или приемник информации.

В файлы можно как помещать данные, так и извлекать их из файлов. Такие действия имеют общее название ввод-вывод.

Функции С++ позволяют читать данные из файлов в ОП, получать их с устройств (напр. с клавиатуры), и записывать данные из ОП в файл или выводить их на различные устройства, напр. на экран или на принтер.

Средства ввода-вывода языка С++ можно разделить на три группы:

  1. ввод-вывод верхнего уровня – потоковый

а) библиотека функций Си - интерфейс в файле <stdio>

б) библиотека классов С++ -интерфейс в файле <fstream>

  1. ввод-вывод нижнего уровня (системный ввод- вывод)-файл <io.h>

  2. ввод-вывод для консоли и портов – интерфейс в файле <conio.h>


Библиотека ввода-вывода С++ включает средства для работы с последовательными файлами, представляющими собой именованную последовательность байтов, имеющую начало и конец. Чтение из файла или запись в файл ведутся байт за байтом, позиции в файле, откуда производится чтение, или куда ведется запись, определяются указателем позиции файла. Указатель позиции записи или чтения устанавливается либо автоматически, либо с помощью функций управления положением его можно установить на нужный байт.


Ввод-вывод нижнего уровня
Функции ввода – вывода низкого уровня позволяют пользоваться средствами ввода-вывода операционной системы непосредственно.

При этом не выполняется буферизация и форматирование данных при обмене.

При низкоуровневом открытии файла с ним связывается целое значение - дескриптор файла (логический номер файла, идентификатор файла), которое назначается операционной системой.

Дескриптор файла характеризует его размещение во внутренних файловых таблицах операционной системы.

Основные функции нижнего уровня:

  1. open( ) / close( ) – открыть / закрыть файл

  2. creat( ) – создать файл

  3. read ( )/ write( ) – читать / писать данные

  4. eof ( ) – проверить достижение конца файла

  5. lseek( ) – изменить текущую позицию в файле

  6. tell ( ) – получить значение текущей позиции в файле


Текстовой и бинарный файлы
Текстовой файл представляет собой последовательность символьных строк переменной длины, разделенных комбинацией символов “перевод каретки” (символ с кодом 13) и символ “перевод строки” (символ с кодом 10).

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

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

Кроме того в текстовом режиме при чтении из файла два символа CR ( 0x0D-конец строки – код 13) и LF (0x0A- переход к началу строки – код 10) преобразуются в один символ новой строки ‘\n’.

При записи в текстовой файл символ новой строки преобразуется в два символа CR и LF.
Бинарный файл предназначен для двоичного режима обмена данными, когда преобразование символов не происходит, и их значения не анализируются. Бинарный файл – это линейная последовательность байтов, соответствующая внутреннему представлению данных без разделения на строки
Создание файла

( на нижнем уровне)
Функция по заданному имени (path) создает новый файл или очищает и подготавливает к работе уже существующий файл.
int creat (const char *path , int mode); // прототип в файле < io.h >
Параметр mode определен в файле

равен: S_IWRITE - для записи

S_IREAD - для чтения

S _IREAD | S_IWRITE - для записи и чтения
Файл создается для работы в режиме обмена либо текстовом (по умолчанию) либо бинарном.

Таким образом файл может создаваться для текстового режима обмена данными или для двоичного. Для установления режима обмена при создании файла надо глобальной системной переменной _fmode , определенной в файлах fcntl.h и stdlib.h надо задать соответствующее значение:

#include < fcntl.h>

_fmode = O_BINARY // по умолчанию O_TEXT
Функция creat() возвращает индивидуальный логический номер файла , идентификатор файла, дескриптор файла при создании файла и –1 при неуспешном завершении.

Пример использования функции:

# include
1   2   3   4   5   6

Похожие:

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconПриказ от 7 сентября 2005 года об утверждении структуры и форматов...
Федеральной налоговой службы от 27 июня 2005 г. N 7н/саэ-3-10/285 "Об обмене информацией в электронном виде между управлениями Федерального...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconПрограмма (задача, мероприятие): Федеральная целевая программа развития...
Ректор фгбоу впо “Саратовский государственный университет имени Н. Г. Чернышевского”

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconВы услышите 6 высказываний. Установите соответствие между высказываниями каждого говорящего
Установите соответствие между высказываниями каждого говорящего a-f и утверждениями^ данными в списке 1-7, Используйте каждое утверждение,...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы icon1 Вы услышите 6 высказываний. Установите соответствие между высказываниями каждого говорящего A
Установите соответствие между высказываниями каждого говорящего a f и утверждениями, данными в списке 1 Используйте каждое утверждение,...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconАудирование вы услышите 6 высказываний. Установите соответствие между...
Установите соответствие между высказываниями каждого говорящего A–F и утверждениями, данными в списке 1 Используйте каждое утверждение,...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconК Протоколу об обмене информацией в электронном виде между налоговыми...
Настоящие Правила определяют порядок заполнения заявления о ввозе товаров и уплате косвенных налогов (далее Заявление) по форме Приложения...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconМежду службами третьих доверенных сторон стран участников Конвенции...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconВы услышите 6 высказываний. Установите соответствие между высказываниями...
Вы услышите 6 высказываний. Установите соответствие между высказываниями каждого говорящего A–F и утверждениями, данными в списке...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconВы услышите 6 высказываний. Установите соответствие между высказываниями...
Установите соответствие между высказываниями каждого говорящего 1–6 и утверждениями, данными в списке A–G. Используйте каждое утверждение,...

Задача программиста установить соответствие между последовательностью байтов потока и участвующими в обмене типизированными объектами программы iconВы услышите 6 высказываний. Установите соответствие между высказываниями...
Установите соответствие между высказываниями каждого говорящего 1–6 и утверждениями, данными в списке A–G. Используйте каждое утверждение,...

Вы можете разместить ссылку на наш сайт:


Все бланки и формы на filling-form.ru




При копировании материала укажите ссылку © 2019
контакты
filling-form.ru

Поиск