КАТЕГОРИИ: Архитектура-(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) |
Прямой доступ к файлам
Форматированный ввод-вывод Блоковый ввод-вывод Для блокового ввода-вывода используются функции: 1) int fread(void*ptr,int size, int n, FILE*f), где void*ptr – указатель на область памяти, в которой размещаются считанные из файла данные, int size – размер одного считываемого элемента, int n – количество считываемых элементов, FILE*f – указатель на файл, из которого производится считывание. В случае успешного считывания функция возвращает количество считанных элементов, иначе – EOF. 2) int fwrite(void*ptr,int size, int n, FILE*f), где void*ptr – указатель на область памяти, в которой размещаются считанные из файла данные, int size – размер одного записываемого элемента, int n – количество записываемых элементов, FILE*f – указатель на файл, в который производится запись. В случае успешной записи функция возвращает количество записанных элементов, иначе – EOF. Пример: struct Employee { char name[30]; char title[30]; float rate; }; void main() { Employee e; FILE *f; if((f=fopen(“f.dat”,”wb”))==NULL) { cout<<”\nCannot open file for writing”; exit(1); } int n; //запись в файл printf(“\nN-?”); scanf(“%d”,&n); for(int i=0;i<n;i++) { //формируем структуру е printf(“\nname:”);scanf(“%s”,&e.name); printf(“\ntitle:”);scanf(“%s”,&e.title); printf(“\nrate:”);scanf(“%s”,&e.rate); //записываем е в файл fwrite(&e,sizeof(Employee),1,f); } fclose(f); //чтение из файла if((f=fopen(“f.dat”,”rb”))==NULL) { cout<<”\nCannot open file for reading”; exit(2); } while(fread(&e,sizeof(Employee)1,f) { printf(“%s % s%f”, e.name, e.title, e.rate) } fclose(f); } В некоторых случаях информацию удобно записывать в файл без преобразования, т. е. в символьном виде пригодном для непосредственного отображения на экран. Для этого можно использовать функции форматированного ввода-вывода: 1) int fprintf(FILE *f, const char*fmt,...), где FILE*f – указатель на файл, в который производится запись, const char*fmt – форматная строка, ... – список переменных, которые записываются в файл. Функция возвращает число записанных символов. 2) 1) int fscanf(FILE *f, const char*fmt, par1,par2,...), где FILE*f – указатель на файл, из которого производится чтение, const char*fmt – форматная строка, par1,par2,... – список переменных, в которые заносится информация из файла. Функция возвращает число переменных, которым присвоено значение. Пример: void main() { FILE *f; int n; if((f=fopen(“int.dat”,”w”))==0) { perror(“int.dat”); exit(0); } for(n=1;n<11;n++) fprinf(f,”\n%d %d”,n,n*n); fclose(f); if((f=fopen(“int.dat”,”r”))==0) { perror(“int.dat”); exit(1); } int nn; while(fscanf(f, ”%d%d”,&n,&nn)) printf(“\n%d %d”,n,nn); fclose(f); }
Рассмотренные ранее средства обмена с файлами позволяют записывать и считывать данные только последовательно. Операции чтения/записи всегда производятся, начиная с текущей позиции в потоке. Начальная позиция устанавливается при открытии потока и может соответствовать начальному или конечному байту потока в зависимости от режима открытия файла. При открытии потока в режимах “r” и “w” указатель текущей позиции устанавливается на начальный байт потока, при открытии в режиме “a” - за последним байтом в конец файла. При выполнении каждой операции указатель перемещается на новую текущую позицию в соответствии с числом записанных/прочитанных байтов. Средства прямого доступа дают возможность перемещать указатель текущей позиции в потоке на нужный байт. Для этого используется функция int fseek(FILE *f, long off, int org), где FILE *f - – указатель на файл, long off – позиция смещения int org – начало отсчета. Смещение задается выражение или переменной и может быть отрицательным, т. е. возможно перемещение как в прямом, так и в обратном направлениях. Начало отсчета задается одной из определенных в файле <stdio.h> констант: SEEK_SET ==0 – начало файла; SEEK_CUR==1 – текущая позиция; SEEK_END ==2 – конец файла. Функция возвращает 0, если перемещение в потоке выполнено успешно, иначе возвращает ненулевое значение. Примеры: fseek(f,0L,SEEK_SET); //перемещение к началу потока из текущей позиции fseek(f,0L,SEEK_END); //перемещение к концу потока из текущей позиции fseek(f,-(long)sizeof(a),SEEK_SET); //перемещение назад на длину переменной а. Кроме этой функции, для прямого доступа к файлу используются: long tell(FILE *f);//получает значение указателя текущей позиции в потоке; void rewind(FILE *f);//установить значение указателя на начало потока.
Дата добавления: 2014-01-04; Просмотров: 365; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |