Создания бинарного файла




Работа с файлами

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

Использование файлов целесообразно в случае:

· долговременного хранения данных;

· доступа различных программ к одним и тем же данным;

· обработки больших массивов данных, которые невозможно целиком разместить в оперативной памяти компьютера.

В заголовочном файле stdio.h содержится описание файлового типа FILE, с которым связывается файловая переменная (указатель на файл).

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

 

 FILE *fopen(const char *filename, const char *mode);

 filename – название файла.

 mode – режим открытия.

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

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

 

 int fclose(FILE *stream);

 stream - указатель на открытый файл.

Функция возвращает:

 0 – файл успешно закрыт.

 1 – произошла ошибка закрытия файла.

 

 

При открытии файла указатель на файл связывается с конкретным файлом на диске и определяется режим открытия файла:

r (r+)-файл открывается для чтения (чтения и записи);

w (w+)-открывается пустой файл для записи (чтения и записи). Если файл с таким именем существует, он стирается;

a (а+)- файл открывается для дополнения в конец (чтения и дополнения).

Режим открытия может также содержать символы t (текстовый файл) и b (двоичный файл), указывающий на вид открываемого файла: rb, wb, ab(Открытие бинарного файла для добавления), rt, at, rb+, wb+, ab+ и т.д.

Закрытие файла (текстового или бинарного) выполняется функцией fclose(), установка указателя на начало файла - функцией rewind ().

Если при попытке чтения данных из файла встречается символ конца файла, то возвращается специальное значение EOF.

Функции feof(), ferror() сообщают о причинах, по которым операция ввода/вывода не выполнилась.

Запись данных в файл и чтение данных из файла можно выполнять разными способами:

1)функциями форматного ввода-вывода fscanf(), fprintf();

2)функциями неформатного ввода-вывода fread(), fwrite().

Если требуется сохранять и восстанавливать числовые данные без потери точности, то лучше использовать fread(), fwrite().

Если обрабатывается текстовая информация, которая будет просматриваться обычными текстовыми редакторами, то используется fgetс()- посимвольное чтение файла, посимвольная запись в файл - fputc() или функции fscanf(), fprintf().

Для чтения из файла и записи в файл строки используются функции fgets() и fputs().

 

Пример: Записать в файл из массива ma все четные цифры и из него записать в новый файл все цифры меньше 11

#include <stdio.h>

#include<locale.h>

void main()

{int i,t;

int ma[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

FILE *pf,*pr;

pf=fopen("new1.txt","w");//открытие файла для записи

for(i=0;i<20;i++)

{

if(ma[i]%2!=0)

{

}else{fprintf(pf,"%d\n",ma[i]);}//запись данных в файл}

fclose(pf);//закрытие файла

pf=fopen("new1.txt","r");//открытие файла для чтения

pr=fopen("new2.txt","w");//открытие файла для записи

while (!feof(pf)) //пока не конец файла цикл будет продолжаться

{fscanf(pf,"%d",&t);

if (t<11)

{fprintf(pr,"%d\n",t);}}

fclose(pf);//закрытие файла

fclose(pr);//закрытие файла

}

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

#include <stdio.h>

#include <conio.h>

 

int main()

{

FILE *myFile;

char fileName[] = "notes.txt";

char c, str[100];

 

printf("Пример использования файлового ввода/вывода\n\n");

 

myFile = fopen(fileName, "r");

 

//Чтение из файла

 

fscanf(myFile, "%s", str);

printf("%s\n", str);

 

fgets(str, 100, myFile);

printf("%s\n", str);

 

c = fgetc(myFile);

printf("%c\n", c);

 

fclose(myFile);

 

//Запись в файл

 

myFile = fopen(fileName, "a");

 

fprintf(myFile, "Summer holidays\n");

 

fputs("Night...\n", myFile);

 

c = 'W';

fputc(c, myFile);

 

fclose(myFile);

 

_getch();

return 0;

}

 

Содержимое файла notes.txt до выполнения программы

Just a string

Kolomna

 

Содержимое файла notes.txt после выполнения программы

Just a string

KolomnaSummer holidays

Night...

W

Бинарные файлы

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

Функция fseek() позволяет обращаться с файлом как с массивом и переходить к любой позиции в файле, обеспечивая возможность произвольного доступа.

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

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

Для чтения и записи в бинарные файлы можно использовать функции fread(), fwrite() или fscanf(),fprintf().

fread –функция для чтения из файла:

int fread(void *ptr, unsigned size, unsigned count, FILE *f);

Из файла f считываются и по адресу ptr записываются count элементов размером size каждый.

Функция возвращает число фактически считанных элементов.

fwrite – функция для записи в файл:

int fwrite(void *ptr, unsigned size, unsigned count, FILE *f);

В файл записываются, начиная с адреса ptr, count элементов размером size каждый. Функция возвращает число фактически записанных элементов.

fseek – функция для произвольного доступа к байтам бинарных файлов:

int fseek(FILE *f, long offset, int w);

offset показывает, на сколько байт нужно сместиться относительно точки отсчёта w.

w должно быть равно одной из трех констант:

SEEK_SET или 0 - начало файла;

SEEK_CUR или 1 – текущая позиция в файле;

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

ftell - возвращает текущую позицию в файле как длинное целое:

long int ftell (FILE *f);

Перемещение к началу файла:

 void rewind(FILE *stream);

Чтение текущей позиции в файле:

 int fgetpos(FILE *stream, fpos_t *pos);

Установка текущей позиции в файле:

 int fsetpos(FILE *stream, const fpos_t *pos);

Функции возвращают:

 0 – все успешно,

 !0 – произошла ошибка.

 

Создания бинарного файла

Работа с функциями файлового ввода/вывода на примере бинарных файлов.

#include <stdio.h>

#include <conio.h>

 

int main()

{

FILE *myFile;

char fileName[] = "data.bin";

int A[] = {5, 8, 12, 65, 74}, B[10], element;

int m, i;

 

printf("Работа с бинарными файлами\n\n");

 

myFile = fopen(fileName, "wb+");

 

m = fwrite(A, sizeof(int), 5, myFile);

printf("Записано %i элементов массива\n", m);

 

rewind(myFile);

m = fread(B, sizeof(int), 5, myFile);

printf("Прочитано %i элементов массива:\n", m);

 

for (i = 0; i < m; i++) printf("%i\n", B[i]);

 

fseek(myFile, 4, SEEK_SET);

fread(&element, sizeof(int), 1, myFile);

printf("\nПрочитан элемент: %i\n", element);

 

fclose(myFile);

 

_getch();

return 0;

}

 

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

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

#include <stdio.h>

#include <locale.h>

#include <conio.h>

#include <string.h>

struct tft{char name[15];int old,curs;};

void vvod();//ввод

void read();//вывести на экран

void creat();//добавить новый эл

void main()

{int a;

struct tft t;

setlocale(LC_ALL,"Russian");

m1:printf("Введите 1 что бы создать файл\nВведите 2 что бы прочитать весь файл\nВведите 3 для добавления в файл\nВведите для выхода 4\n");

scanf("%d",&a);

switch (a){

case 1:vvod(&t);goto m1;

case 2:read(&t);goto m1;

case 3:creat(&t);goto m1;

case 4: goto m2;}

m2:;

getch();}

 

void vvod(struct tft (*t))

{FILE *p; char y;

p=fopen("fil.txt","wb");

do

{

printf("Введите имя студента(не более 15 букв)\n");

scanf("%s",&(*t).name);

printf("Введите возраст\n");

scanf("%d",&(*t).old);

printf("Введите курс студента\n");

scanf("%d",&(*t).curs);

fwrite(&(*t),sizeof(*t),1,p);

printf("Введите y для выхода =\n");

y=getch();

} while (y!='y');

fclose(p);}

void read(struct tft (*t))

{FILE *p;int i;

p=fopen("fil.txt","rb");

i=1;

fread(&(*t),sizeof(*t),1,p); // чтение из файла одной структуры t1

printf("Номер\tИмя\t\tВозраст\tКурс");

while (!feof(p))

{ printf("\n№%d\t%s \t\t%d\t%d",i,(*t).name,(*t).old,(*t).curs);

fread(&(*t),sizeof(*t),1,p);

i++;}

getch();}

 

void creat(struct tft (*t))

{FILE *p; char y;

p=fopen("fil.txt","ab");

do

{printf("Введите имя студента(не более 15 букв)\n");

scanf("%s",&(*t).name);

printf("Введите возраст\n");

scanf("%d",&(*t).old);

printf("Введите курс студента\n");

scanf("%d",&(*t).curs);

fwrite(&(*t),sizeof(*t),1,p);

printf("Введите y для выхода =\n");

y=getch();

} while (y!='y');

fclose(p);}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: