Скачать 449.68 Kb.
|
#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);
… int n = filelength(fd) / sizeof(запись); … //количество записей в файле 2) int chsize ( int handle, long size );
Возвращает 0 , если изменение прошло успешно и –1 , если нет. 3) int remove ( const char*filename ) ; - уничтожает существующий на диске файл с именем filename, который перед удалением должен быть закрыт. Возвращает 0 , если удаление прошло успешно и –1 , если нет. 4) int rename ( const char*oldname , const char*newname ) - переименование существующего файла с именем oldname, который перед переименованием должен быть закрыт. Новое имя newname должно быть оригинально на диске. Возвращает 0 , если переименование прошло успешно и –1 -, если нет. Потоковый ввод- вывод на базе библиотеки классов Рассмотрим механизмы выполнения основных работ с файлами на базе связи файлов с потоками ввода-вывода. Основные виды работ с файлами
Создание потоков Потоки для работы с файлами – объекты следующих классов: 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)< } //запись и чтение файла с помощью функций 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’, который включается в строку
результат дополняется символом ’\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 , … ] ); - выводит данные в строку , расположенную в ОП. Функция преобразует данные – аргументы в символьный массив. Удобна при работе с графикой , когда нужно вывести на экран числа, а можно выводить только строки. 3> |
Федеральной налоговой службы от 27 июня 2005 г. N 7н/саэ-3-10/285 "Об обмене информацией в электронном виде между управлениями Федерального... | Ректор фгбоу впо “Саратовский государственный университет имени Н. Г. Чернышевского” | ||
Установите соответствие между высказываниями каждого говорящего a-f и утверждениями^ данными в списке 1-7, Используйте каждое утверждение,... | Установите соответствие между высказываниями каждого говорящего a f и утверждениями, данными в списке 1 Используйте каждое утверждение,... | ||
Установите соответствие между высказываниями каждого говорящего A–F и утверждениями, данными в списке 1 Используйте каждое утверждение,... | Настоящие Правила определяют порядок заполнения заявления о ввозе товаров и уплате косвенных налогов (далее Заявление) по форме Приложения... | ||
Вы услышите 6 высказываний. Установите соответствие между высказываниями каждого говорящего A–F и утверждениями, данными в списке... | |||
Установите соответствие между высказываниями каждого говорящего 1–6 и утверждениями, данными в списке A–G. Используйте каждое утверждение,... | Установите соответствие между высказываниями каждого говорящего 1–6 и утверждениями, данными в списке A–G. Используйте каждое утверждение,... |
Поиск Главная страница   Заполнение бланков   Бланки   Договоры   Документы    |