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


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


#include

#include

… int fd ;

fd = creat (“ examp.cpp”, S_WRITE);

if( fd = = -1) cout<<”Ошибка”…

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

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

:

O_APPEN – открыть для дополнения;

O_BINARY – открыть в бинарном режиме;

O_CREAT – создать и открыть новый файл;

O_EXCL – в сочетании с O_CREAT создает только новый файл , если

файл существует, он не стирается , выводится сообщение об

ошибке;

O_RONLY – открыть только для чтения;

O_RDWR – открыть и для чтения и для записи;

O_TEXT – открыть в текстовом режиме;

O_TRUNC - открыть существующий файл и стереть его содержимое;

O_WRONLY- открыть только для записи.
Режим открытия должен устанавливаться явно , т.к. умолчания нет.

Вызов функции creat ( ) эквивалентен вызову:
open( имя файла ,O_CREAT|O_TRUNC|O_WRONLY).
Для закрытия файлов функция:

int close( дескриптор файла)

Возвращает 0 при успешном закрытии и -1 в случае ошибки.
Чтение и запись данных
int read( int fd, char* buffer, unsigned int count)
читает count байт из файла, с дескриптором fd в буфер buffer.

Возвращает число байт, помещенных в буфер;

0 – при достижении конца файла; - 1 – при возникновении ошибки чтения.

Чтение идет с текущей позиции в файле. В текстовом режиме идет преобразование двух символов к одному ‘\n’ и в возвращаемом значении вместо двух символов учитывается один.
int write( int fd, char* buffer, unsigned int cout)
- записывает count байт из буфера buffer в файл, открытый с дескриптором fd .

Запись идет с текущей позиции. Возвращает количество реально записанных байтов, в текстовом режиме это количество будет превышать количество реально записанных байтов за счет преобразования ‘\n’ в CR и LF.

Возвращает –1 при ошибке записи ( напр. нет места на диске).

Копирование файла



void main()

{ int fdin , fdout, n ;

char buf[512]; // размер стандартного буфера – размер кластера

if( fdin =open(“f1.dat” , O_RDONLY) = = -1) {cout<<”Ошибка 1”; exit(1);}

if( fdout =open(“f2.dat” , O_WRONLY|O_CREAT|O_TRUNC) = = -1) {cout<<”Ошибка 2”; exit(1);}

while (n=read(fdin, buf , 512)>0)

write( fdout, buf, n);

}

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

long lseek( int fd, long offset, int origin)
Изменяет позицию в файле с дескриптором fd относительно origin на offset байт.

Параметр origin задает точку отчета:

SEEK_SET = = 0 - начало файла

SEEK_CUR = = 1 - текущая позиция

SEEK_END = = 2 – конец файла.

Возвращает новую позицию в файле от начала, от нуля.
lseek( fd, 0L, SEEK_SET); -установка на начало

lseek( fd, 0L, SEEK_END); -установка на конец файла
Функция определяющая текущую позицию в файле

long tell( int fd);


read(fd, buf, sizeof ( запись) ) ;

lseek( fd , - sizeof ( запись) ,SEEK_CUR);



write( fd, buf, sizeof(запись) ) ;…
Полезные функции:
Как правило, параметру для дескриптора файла во всей литературе дают имя handle

1) long filelength ( int handle);


  • возвращает длину файла связанного с дескриптором handle в байтах.

… int n = filelength(fd) / sizeof(запись); … //количество записей в файле
2) int chsize ( int handle, long size );


  • изменяет длину файла , связанного с handle – усекает его или расширяет в зависимости от соотношения между size и первоначальной длины файла, size новая длина файла. При расширении новое место заполняется символами \0.

Возвращает 0 , если изменение прошло успешно и –1 , если нет.
3) int remove ( const char*filename ) ;
- уничтожает существующий на диске файл с именем filename, который перед удалением должен быть закрыт.

Возвращает 0 , если удаление прошло успешно и –1 , если нет.
4) int rename ( const char*oldname , const char*newname )
- переименование существующего файла с именем oldname, который перед переименованием должен быть закрыт.

Новое имя newname должно быть оригинально на диске.

Возвращает 0 , если переименование прошло успешно и –1 -, если нет.


Потоковый ввод- вывод на базе библиотеки классов
Рассмотрим механизмы выполнения основных работ с файлами на базе связи файлов с потоками ввода-вывода.

Основные виды работ с файлами

  1. создание файла;

  2. создание потока;

  3. открытие файла;

  4. присоединение файла к потоку

  5. обмены с файлом с помощью потока

  6. отсоединение потока от файла

  7. закрытие файла



Создание потоков
Потоки для работы с файлами – объекты следующих классов:
ofstream - для записи данных в файл

ifstream - для чтения данных из файла

fstream - для чтения и записи данных
Описание этих классов находится в файле < fstream>
Определение потоков - объектов классов

( первый способ – создание объекта с помощью конструктора по умолчанию)
ofstream Fout //выходной файловый поток
ifstream Fin //входной файловый поток
fstream Fio //входной выходной файловый поток

При таком создании под объекты выделяется память – это буфер обмена и инициируются переменные, характеризующие состояние потока
Т. к. классы файловых потоков являются производными классами от классов стандартных входных и выходных потоков и от класса ios , то они наследуют все переменные и флаги состояния потока , а также компонентные функции, выполняющие форматированный и не форматированный обмен , которые мы рассмотрели выше.
Создав файловый поток, нужно присоединить его к конкретному файлу с помощью компонентной функции open ().
Эта функция открывает файл ( если он существует) или создает новый файл и связывает его с потоком

void open (const char* filename, int mode= умалчиваемые значения,

int protection= умалчиваемые значения)
Первый параметр – имя файла.

Второй - дизъюнкция флагов , определяющих режим работы с файлом

ios:: in = 0x01 // открыть только для чтения
ios:: out = 0x02 // открыть только для записи
ios:: ate = 0x04 // при открытии искать конец файла
ios:: app = 0x08 // дописывать данные в конец файла
ios::trunc= 0x10 //вместо существующего создать новый файл
ios::nocreate=0x20 //не открывать новый файл, (ошибка, если файл не

существует)

ios::noreplace=0x40 // не открывать существующий файл
ios::binary = 0x80 // открыть для двоичного обмена
Умалчиваемое значение параметра mode для потока класса ifstream равно

ios::in для потока класса ofstream равно ios::out.
Для третьего параметра, определяющего защиту, используется умалчиваемое значение, которое всегда устраивает пользователя.

Вызов компонентной функции осуществляется с помощью уточненного имени:

Имя объекта . вызов компонентной функции
Имя потока. open( имя файла, режим , защита)
Fout. open( “ D:\\ DATA\\work.dat» ) // по умолчанию ios::out, если файл не существует, он будет создан и присоединен к потоку Fout.

Применяя к потоку операцию включения Fout << …

или вызывая компонентные функции Fout.put(‘…’) или Fout.write(…) , запись будет производиться в файл.
Fin.open(«result.txt» ) // по умолчанию ios::in, если файл не существует, то вызов функции приведет к ошибке. Существующий файл присоединяется к потоку Fin.

Применяя операцию извлечения Fin>>…, или вызывая компонентные функции Fin.get(…) , Fin. getline(…), Fin.read(…)можно читать из файла
Fio.open(«change.dat», ios::out) // файл открыт для записи и будет иметь такую направленность до закрытия, потом его можно вновь открыть для считывания.

Для проверки удачности завершения open( ) существует перегруженная для классов потоков операция ! . Если ошибок не было , то ! имя потока выражение имеет нулевое значение, противном случае не нулевое.

(Если !поток равно нулю, то все хорошо, т.е. поток не должен быть нулевым)



if( ! Fin) { cout<< «ошибка при открытии файла»<Закрытие файла
имя файлового потока(присоединенного к файлу). close()

Чтобы изменить режим доступа к файлу, его надо закрыть и открыть вновь в нужном режиме.

Присоединение к потоку , используя дескриптор файла
Если файл был открыт с помощью функции creat( ), то для присоединения к файловому потоку можно использовать компонентную функцию attach ( ), доставшуюся по наследству от базовых классов. Эта функция имеет параметром дескриптор открытого файла
… int descrip= creat ( «имя_файла», S_WRITE);
… ofstream Fout ; //определение потока

Fout.attach ( descript);// присоединение файла с дескриптором descript к

//потоку Fout

if(!Fout) { cerr<<»ошибка присоединения файла» ; exit(1) }

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

ifstream input (« filename.ext», ios::in )
ofstream output(« filename.out», ios::out)
fstream ioput (« …» ,ios:: out)
После можно писать в файл и читать из файла

input.read ( buffer , number_of_buffer )
output.write( buffer , number_of_buffer )
Эти функции возвращают ссылку на поток, поэтому их можно выполнять цепочкой.
Удобно использовать компонентную функцию этих классов
int eof( )

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

и чтения из текстового файла.

#include

#include

ofstream fout;

ifstream fin;

struct st

{ char name [20]; long sh, cen;}zap[3]={ {"yy yyy", 1745,186},

{"oooo", 1234,78},

{"ddddddddd", 3421,96}};

//перегрузка

ofstream & operator << (ofstream& out , st zap2)

{ out <
return (out);}
ifstream& operator >> (ifstream& fin , st& zap)

{ char ch[5];

fin.getline(zap.name,10); fin >> zap.sh >> zap.cen;

fin.getline(ch,5,'\n');

return fin;}
struct st zap1;

void main()

{

fout.open( "\\myf");

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

fout<
fout.close();

fin.open("\\myf") ;

лев. выр. 10сс призн. сс .0 +

//cout << cout.setf(0x0002|0x0010|0x0080|0x0200|0x0400) ;

16сс

//cout << cout.setf(0x0002|0x0040|0x0080|0x0200) ;
for(int i=0 ; i<3 ; i++)

{fin>> zap1;
cout <<"\n"<< zap1.name << setw(15)<fin.close();

}

//запись и чтение файла с помощью функций read и write
#include

#include

ofstream fout;

ifstream fin;

struct st { char* name; char* FIO ; long sh, cen;}zap1,zap={ "rrrrr rrrrr",

"fff ff",1745,186};

void main()

{ st*p = &zap;

char *ss = (char*)p ;
fout.open( "\\myf",0x80);
fout.write(ss, sizeof(st)) ;

fout.close();

fin.open("\\myf",ios::in|0x80) ;

fin.read((char*)&zap1,sizeof(st));

fin.close();

cout << zap1.name<<"\n"<
}
Библиотека ввода-вывода Си ( stdio.h)
Рассмотрим функции обмена верхнего уровня, которые обеспечивают

буферизацию данных при обмене с файлом.

Функции реализуют обмен с потоком-источником или приемником последовательности байт(в бинарном режиме) или последовательности строк (в текстовом режиме обмена)

Открытие файла
Объявляется указатель на структуру типа FILE, в которой должна будет содержаться информация о файле. Тип FILE определен в файле stdio.h
typedef struct

{shot level; // уровень буфера

unsigned flags ; // флаг статуса файла

int fd ; // дескриптор файла

…} FILE
Далее в программе должен быть объявлен указатель на структуру типа FILE ( указатель на файловый поток) :

#include

FILE* F;

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

Прототип:

FILE* fopen (char *filename , char *type);

Вызов:

F = fopen (имя файла, режим открытия);
Параметр filename определяет полное имя физического файла

Параметр type определяет режим работы с файлом

«r» - чтение , файл должен быть создан

«w» - создание нового файла для записи

«a» -дополнение записи в конец файла

«+» -допускается чтение из файла и запись в файл

«wb» - запись в бинарный файл

«rb» -чтение из бинарного файла

и.т.д.
FILE *fid, frz, fin;

Fid= fopen («lr.dat», «r») - открыт для чтения

Frz=fopen(«lr.rez», «w») -открыт для вывода

Fin=fopen(«lr.res», «a+») - открыт для чтения и дополнения
При успешном выполнении функция возвращает указатель на FILE.

В противном случае возвращает NULL.

Закрытие файла

Функции закрытия файлового потока:

Прототипы:

int fclose( FILE* stream ); int fcloseall( );

вызов:

fclose(fid);

Возвращает 1-ая- 0 при успешном закрытии

2-ая –количество закрытых потоков

-1 при неуспешном закрытии.
Бесформатный ввод-вывод в текстовой файл
а) посимвольный , б) построчный
а)

Посимвольный ввод

int getchar(void), int fgetchar (void) , -ввод символа с клавиатуры чтение из стандартного потока stdin
int getc (FILE*stream) , int fgetc (FILE*stream) -ввод символа из входного

файла

int getch(void) – ввод символа с клавиатуры без эхопечати.
Посимвольный вывод
int putc ( int c, FILE*stream) ; вывод символа в файл

int fputc(int c, FILE*stream) ;
void putch(int c), putchar(int c, ) вывод символа на экран в стандартный поток stdout
б)

Построчный ввод – вывод
Ввод :

char* gets (char* string) – читает строку из стандартного потока до символа ‘\n’ и помещает ее по адресу параметра string, символ ‘\n’ не включается, результат дополняется символом ’\0’
char* fgets (char* string, int n , FILE*stream) – читает строку из файла

до 1) символа ‘\n’, который включается в строку

  1. до конца файла

  2. прочитано n-1 символ

результат дополняется символом ’\0’

Функции возвращают адрес строки string или NULL
Вывод:

int puts (char* string) – выводит строку string в стандартный поток stdout до символа ‘\0’ и помещает в довершение символ ‘\n’. После вывода строки курсор переместится на новую строку.
int fputs (char* string, FILE*stream) – выводит строку string в файловый поток stream до символа ‘\0’

Функции возвращают код последнего выведенного символа , или –1, если ошибка вывода.
Форматный ввод- вывод данных в текстовой файл
Функции ввода

int scanf ( char*format [, arg , … ] );

int fscanf( FILE*stream , char*format [, arg , … ] );
И функции вывода

int printf( char*format [, arg , … ] );

int fprintf( FILE*stream, char*format [, arg , … ] );
Эти функции были рассмотрены ранее.
int sscanf ( char*string , char*format [, arg , … ] );– читает даннае из строки
string , « распоковка » строки

int sprintf ( char*string , char*format [, arg , … ] ); - выводит данные в строку , расположенную в ОП. Функция преобразует данные – аргументы в символьный массив. Удобна при работе с графикой , когда нужно вывести на экран числа, а можно выводить только строки.

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

Поиск