Работа с файлами
Файл - это упорядоченная последовательность однотипных компонентов, расположенных на внешнем носителе. Файлы предназначены только для хранения информации, а обработка этой информации осуществляется программами.
Использование файлов целесообразно в случае:
· долговременного хранения данных;
· доступа различных программ к одним и тем же данным;
· обработки больших массивов данных, которые невозможно целиком разместить в оперативной памяти компьютера.
В заголовочном файле 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);}