Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в программирование на С.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
930.82 Кб
Скачать

Создание файла произвольного доступа.

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

8.3 Работа с бинарным файлом

unsigned fread(void *ptr,unsigned size,unsigned n, FILE *stream);

Первый параметр- это указатель на буфер, в котором будут помещены данные из файла; следующие два параметра задают размер блока и количество читаемых блоков соответственно; последний параметр – это указатель на файл с которого считываются данные. Возвращает функция число успешно прочитанных элементов данных.

Индикатор текущей позиции в файле передвигается на число успешно прочитанных символов. В случае возникновения ошибки значение индикатора становится неопределенным.

unsigned fwrite(void *ptr,unsigned size,unsigned n, FILE *stream);

Первый параметр- это указатель на буфер, из которого будут помещены данные в файл; следующие два параметра задают размер блока и количество записываемых блоков соответственно; последний параметр – это указатель на файл в который записываются данные. Возвращает функция число успешно прочитанных элементов данных.

Индикатор текущей позиции в файле передвигается на число успешно записанных символов. В случае возникновения ошибки значение индикатора становится неопределенным.

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

#include<stdio.h>

#include<stdlib.h>

Void main()

{

FILE *f1;

int n;

if(!(f1=fopen("int.bin","w+b"))){

puts("FILE ne otkrit!!!!!!");

exit(1);

}

puts("Zapis` v file: ");

do{

scanf("%d",&n);

fwrite(&n,sizeof(int),1,f1);

}while(n);

fseek(f1,0,0);

puts("\nSoderzanie faila:");

do{

fread(&n,sizeof(int),1,f1);

printf(" %d",n);

}while(n);

fclose(f1);

}

Программа, которая читает 10 чисел с конца из заранее созданного файла.

#include<stdio.h>

char name[]="int.bin";

Void main()

{

int i,n=10,x;

FILE *f;

f=fopen(name,"rb");

if(!f)

return;

for(i=1;i<=n;i++){

fseek(f,-i*sizeof(int),SEEK_END);

fread(&x,sizeof(int),1,f);

printf("\n%d\n",x);

}

fclose(f);

}

Функция для записи в файл.

void fill_file (FILE * f){

int x;

scanf(“%d”,&x);

while(x){

fwrite(&x,sizeof(int),1,f);

scanf(“%d”,&x);

}

}

Функция определение длины файла.

int getFileSize(FILE *f){

int count=0,tmp;

fseek(f,SEEK_SET,0);

while(!feof(f)){

fread(&tmp,sizeof(int),1,f);

count++;

}

return count-1;

}

Функция, читающая элемент заданной позиции.

int getElementAtPosition(int i,FILE*f){

int buf;

fseek(f,i*sizeof(int),SEEK_SET);

fread(&buf,sizeof(int),1,f);

return buf;

}

Функция, записывающая элемент в заданную позицию.

void setFileElements (int pos , int element ){

fseek (f , pos * sizeof (int) , SEEK_SET );

fwrite (&element ,sizeof (int) , 1 , f);

}

Функция, вывода элементов файла

void print_file (FILE * f){

fseek(f,SEEK_SET,0);

for (int i=0; ! feof (f); i++){

int x;

if ( ! fread (&x , sizeof (int) , 1 , f) ) break;

printf ("element # %d = %d\n" , i , x);

}

}

Программа с использованием данных функций.

#include<stdio.h>

#include<stdlib.h>

int getFileSize(FILE *f);//Считает количество чисел в файле

int getElementAtPosition(int i,FILE*f);//Возвращает число записанное на i-ой позиции

void setFileElements (int pos , int element , FILE * f);//Заменяем число на позиции pos на число element

void print_file (FILE *f);//выводит содержание файла

void main()

{

FILE *f1;

int n,n1;

if(!(f1=fopen("int.bin","w+b")))

{

puts("FILE ne otkrit!!!!!!");

exit(1);

}

puts("Zapis` v file: ");

do

{

scanf("%d",&n);

fwrite(&n,sizeof(int),1,f1);

}while(n);

puts("\nSoderzanie faila:");

fseek(f1,0,0);

print_file(f1);

puts("\nKolichestvo elementov:");

fseek(f1,0,0);

printf("%d\n",getFileSize(f1));

puts("\nVvedite nomer elementa konori xotite uvidet: ");

scanf("%d",&n);

fseek(f1,0,0);

printf("[%d]=%d\n",n,getElementAtPosition(n,f1));

puts("\nVvedite element konori xotite pomestit v file: ");

scanf("%d",&n);

puts("\nVvedite kuda vstavit element: ");

scanf("%d",&n1);

fseek(f1,0,0);

setFileElements(n1,n,f1);

puts("\nSoderzanie faila:");

fseek(f1,0,0);

print_file(f1);

puts("\nKolichestvo elementov:");

fseek(f1,0,0);

printf("%d\n",getFileSize(f1));

fclose(f1);

}

int getFileSize(FILE *f)

{

int count=0,tmp;

fseek(f,SEEK_SET,0);

while(!feof(f))

{

fread(&tmp,sizeof(int),1,f);

count++;

}

return count-1;

}

int getElementAtPosition(int i,FILE*f)

{

int buf;

fseek(f,i*sizeof(int),SEEK_SET);

fread(&buf,sizeof(int),1,f);

return buf;

}

void setFileElements (int pos , int element , FILE * f){

fseek (f , pos * sizeof (int) , SEEK_SET );

fwrite (&element ,sizeof (int) , 1 , f);

}

void print_file (FILE *f){

fseek(f,SEEK_SET,0);

for (int i=0; ! feof (f); i++){

int x;

if ( ! fread (&x , sizeof (int) , 1 , f) ) break;

printf ("element # %d = %d\n" , i , x);

}

}

Задачи:

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

#include<stdio.h>

#include<stdlib.h>

void fill_file(FILE *,int *);

void print_file(FILE *,int *);

void print_file_end(FILE *,int *);

char name[]="chisla.bin";

void main(){

int n;

FILE *k;

k=fopen(name,"w+b");

if(!k)

return;

fill_file(k,&n);

print_file(k,&n);

print_file_end(k,&n);

fclose(k);

}

void fill_file(FILE *k,int *p){

int x,i;

printf("Vvedive kol: ");

scanf("%d",p);

for(i=0;i<*p;i++){

scanf("%d",&x);

fwrite(&x,sizeof(int),1,k);

}

}

void print_file(FILE *k,int *p){

puts("\n");

int x,i;

fseek(k,0*sizeof(int),SEEK_SET);

for(i=0;i<*p;i++){

fread(&x,sizeof(int),1,k);

printf("[%d]=%d\n",i,x);

}

}

void print_file_end(FILE *k,int *p){

puts("\n");

int x,i;

for(i=1;i<=*p;i++){

fseek(k,-i*sizeof(int),SEEK_END);

fread(&x,sizeof(int),1,k);

printf("%d\n",x);

}

}

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

#include<stdio.h>

#include<stdlib.h>