Файлы. Текстовые и бинарные файлы

Содержание

Слайд 2

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый

в процессе обработки как единое целое. В файлах размещаются данные, предназначенные для длительного хранения.
Различают два вида файлов: текстовые и бинарные.
Текстовые файлы представляют собой последовательность символов и могут быть просмотрены и отредактированы с помощью любого текстового редактора.
Бинарные (двоичные) файлы представляют собой последовательность данных, структура которых определяется программно.
Слайд 3

Файлы рассматриваются компилятором как последовательность (поток байт) информации. В начале работы

Файлы рассматриваются компилятором как последовательность (поток байт) информации. В начале работы

любой программы автоматически открываются стандартные потоки ввода (stdin) и вывода (stdout).
Для файлов определен указатель (маркер) чтения-записи данных, который определяет текущую позицию доступа к файлу.
В языке Си имеется большой набор функций для работы с файлами, большинство в stdio.h и io.h.
Потоки данных, с которыми работают функции ввода-вывода по умолчанию, буферизированы. При открытии потока с ним связывается определенный участок памяти, который называется буфером. Все операции чтения-записи ведутся через этот буфер.
Слайд 4

Для обработки любого файла необходимо выполнить следующие действия: 1) открыть файл;

Для обработки любого файла необходимо выполнить следующие действия:
1) открыть файл;
2) обработать

данные файла (запись, чтение, поиск и т.п.);
3) закрыть файл.
Слайд 5

Открытие файла Каждому файлу в программе присваивается внутреннее логическое имя, используемое

Открытие файла
Каждому файлу в программе присваивается внутреннее логическое имя, используемое в

дальнейшем при обращении к нему.
Логическое имя (имя файла) – это указатель на файл, т.е. на область памяти, где содержится вся необходимая информация о нем.
Формат объявления :
FILE *Имя_Указателя;
FILE – структурный тип, описанный в библиотеке stdio.h (содержит 9-ть полей).
Слайд 6

Прежде чем начать работать с файлом, его нужно открыть для доступа

Прежде чем начать работать с файлом, его нужно открыть для доступа

с помощью функции
fopen ( Имя_Файла, Режим )
Данная функция фактическому Имени Файла на носителе (дискета, винчестер) ставит в соответствие логическое имя (Указатель файла).
Имя файла и путь к нему задается первым параметром – строкой, например:
“d:\\work\\Sved.txt” – файл с именем Sved, расширением txt, находящийся на винчестере в папке work.
Обратный слеш «\», как специальный символ в строке записывается дважды.
Слайд 7

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

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

успешном открытии функция fopen возвращает указатель на файл (указатель файла).
При ошибке возвращается NULL.
Ошибки обычно возникают, когда неверно указывается путь к открываемому файлу, например, если указать путь, запрещенный для записи.
Слайд 8

Второй параметр – строка, в которой задается режим доступа к файлу:

Второй параметр – строка, в которой задается режим доступа к файлу:
w

– файл открывается для записи (write);
если файла нет, то он создается; если файл уже есть, то прежняя информация уничтожается;
r – файл открывается для чтения (read); если такого файла нет, то возникает ошибка;
a – файл открывается для добавления (append) новой информации в конец;
r+ – файл открывается для редактирования данных;
t – файл открывается в текстовом режиме;
b – файл открывается в двоичном режиме.
Слайд 9

Последние два режима используются совместно с рассмотренными выше. Возможны следующие комбинации

Последние два режима используются совместно с рассмотренными выше. Возможны следующие комбинации

режимов доступа: w+b, wb+, rt+, а также некоторые другие комбинации.
По умолчанию файл открывается в текстовом режиме.
Пример открытия файла:
FILE *f; – Объявляется указатель f
f = fopen ("Dat_sp.dat ", "w");
– открывается для записи файл с указателем f в текущей папке, имеющий имя Dat_sp.dat,
или более кратко:
FILE *f = fopen ("Dat_sp.dat", "w");
Слайд 10

Закрытие файла После работы с файлом доступ к нему необходимо закрыть

Закрытие файла
После работы с файлом доступ к нему необходимо закрыть с

помощью функции
fclose ( Указатель_Файла );
Для предыдущего примера: fclose ( f );
Если надо изменить режим доступа к уже открытому файлу, то его необходимо закрыть, а затем открыть с другим режимом:
freopen ( Имя_Файла, Режим, Указатель );
- закрывается файл с заданным в третьем параметре Указателе (аналогично функции fclose), а затем открывается файл, используя первый и второй параметры (аналогично функции fopen).
Слайд 11

Запись-чтение информации Основными действиями при работе с файлами являются запись и

Запись-чтение информации
Основными действиями при работе с файлами являются запись и чтение

информации.
Все действия по чтению-записи данных в файл можно разделить на три группы:
– операции посимвольного ввода-вывода;
– операции построчного ввода-вывода;
– операции ввода-вывода блоками.
Рассмотрим основные функции записи-чтения данных.
Слайд 12

Создание текстовых результирующих файлов обычно необходимо для оформления различных отчетов. Для

Создание текстовых результирующих файлов обычно необходимо для оформления различных отчетов.
Для работы

с текстовыми файлами чаще всего используются функции
fprintf, fscanf, fgets, fputs
Параметры и действия этих функций аналогичны рассмотренным ранее функциям printf, scanf, gets и puts.
Отличие состоит в том, что printf и др. работают по умолчанию с экраном монитора и клавиатурой, а функции fprintf и др. – с файлом, указатель которого является одним из параметров.
Слайд 13

Например: . . . FILE *f1; int a = 2, b

Например:
. . .
FILE *f1;
int a = 2, b = 3;
printf (

” %d + %d = %d \n ”, a, b, a+b);
fprintf ( f1,” %d + %d = %d\n ”, a, b, a+b);
fclose ( f1 );
. . .
Просмотрев файл f1 любым текстовым редактором, можно убедиться, что данные в нем располагаются так же, как и на экране.
Слайд 14

Бинарные файлы обычно используются для обработки данных, состоящих из структур, чтение

Бинарные файлы обычно используются для обработки данных, состоящих из структур, чтение

и запись которых удобно выполнять блоками.
Функция
fread ( p, size, n, f );
выполняет чтение из файла «f» «n» блоков размером «size» байт каждый в область памяти, адрес которой «p». В случае успеха функция возвращает количество считанных блоков.
Функция
fwrite ( p, size, n, f );
выполняет запись в файл «f» «n» блоков размером «size» байт каждый из области памяти, с адресом «p».
Слайд 15

Позиционирование в файле Каждый открытый файл имеет скрытый указатель на текущую

Позиционирование в файле
Каждый открытый файл имеет скрытый указатель на текущую позицию

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

fseek ( f, size, code ) выполняет смещение указателя файла f

fseek ( f, size, code )
выполняет смещение указателя файла f на

size байт в направлении code :
0 – смещение от начала;
1 – смещение от текущей позиции;
2 – смещение от конца файла.
Смещение может быть как положительным, так и отрицательным, но нельзя выходить за пределы файла.
В случае успеха функция возвращает 0, 1 –при ошибке, например, выход за пределы файла.
Доступ к файлу с использованием этой функции называют произвольным доступом.
Слайд 17

Рассмотрим некоторые полезные функции: 1) ftell ( f ) – определяет

Рассмотрим некоторые полезные функции:
1) ftell ( f ) – определяет значение

указателя на текущую позицию в файле, –1 в случае ошибки;
2) fileno ( f ) – определяет значение дескрип-тора (fd) файла f, т.е. число, определяющее номер файла;
3) filelength ( fd ) – определяет длину файла в байтах, имеющего дескриптор fd;
4) chsize ( fd, pos ) – выполняет изменение размера файла, имеющего номер fd, признак конца файла устанавливается после байта с номером pos;
5) feof ( f ) – возвращает ненулевое значение при правильной записи признака конца файла.
Слайд 18

Пример 1 #include #include #include void main() { FILE *file; char*

Пример 1
#include #include
#include void main()  { FILE *file; char* file_name ;
char t[100],str[100]; char load_string[50]

= "none"; cin>>t; gets(str);
strcat(t,".txt");
file_name=t; file = fopen( file_name, "w" );  fputs( str, file ); fclose( file );
Слайд 19

file = fopen( file_name, "r" ); //Открытие файла для чтения if(

file = fopen( file_name, "r" ); //Открытие файла для чтения if( file

!= 0 ) { fgets( load_string, 50 , file );  cout << "load_string = " << load_string << endl; } else { cout << "File not found !!!" << endl; } fclose(file); }
Слайд 20

Пример 2 Создать программу, в которой реализованы создание, добавление и просмотр

Пример 2 Создать программу, в которой реализованы создание, добавление и просмотр

файла, содержащего информацию о фамилии и среднем балле студентов. Процесс добавления информации заканчивается при нажатии точки.
#include
#include
struct Sved {
char Fam[30];
double S_Bal;
} zap,zapt;
Слайд 21

char Spis[]="c:\\work\\Sp.dat"; FILE *F_zap; FILE* Open_file(char*, char*); void main (void) {

char Spis[]="c:\\work\\Sp.dat";
FILE *F_zap;
FILE* Open_file(char*, char*);
void main (void)
{
int i, j, kodR,

size = sizeof(Sved), kod_read;
while(1) {
puts("Создать – 1\n Просмотреть– 2\n Добавить– 3\n Выход – 0");
scanf("%d",&kodR);
Слайд 22

switch(kodR) { case 1: case 3: if(kodR==1) F_zap = Open_file (Spis,"w+");

switch(kodR) {
case 1:
case 3:
if(kodR==1) F_zap = Open_file (Spis,"w+");
else
F_zap =

Open_file (Spis,"a+");
while(1) {
puts("\n Fam (. – end) ");
scanf("%s",zap.Fam);
if((zap.Fam[0])=='.') break;
puts("\n Ball: ");
scanf("%lf",&zap.S_Bal);
fwrite(&zap,size,1,F_zap);
}
fclose(F_zap);
Слайд 23

break; case 2: F_zap = Open_file (Spis,"r+"); int nom=1; while(1) {

break;
case 2: F_zap = Open_file (Spis,"r+"); int nom=1;
while(1) {
if(!fread(&zap,size, 1,

F_zap)) break;
printf(" %2d: %20s %5.2lf\n",
nom++, zap.Fam, zap.S_Bal);
}
fclose(F_zap);
break;
case 0: return; // exit(0);
} // Закрывает switch()
} // Закрывает while()
}
Слайд 24

// Функция обработки ошибочной ситуации при открытии файла FILE* Open_file(char *file,

// Функция обработки ошибочной ситуации при открытии файла
FILE* Open_file(char *file, char

*kod)
{
FILE *f;
if(!(f = fopen(file, kod))) {
puts("Open File Error!");
exit(1);
}
return f;
}
Слайд 25

Пример 3 Открыть файл и записывать туда все вводимые с клавиатуры

Пример 3 Открыть файл и записывать туда все вводимые с клавиатуры

числа, до тех пор, пока не будет введено число -1. Отсортировать данные в файле по возрастанию.
#include
#include
#include
#include
FILE *fl;
void fbw();
void fbsort();
void fbr();
Слайд 26

int main() { fbw(); // Запись в файл fbsort(); // Сортировка

int main()
{
fbw(); // Запись в файл
fbsort(); //

Сортировка в файле
fbr(); // Чтение из файла
return 0;
}
Слайд 27

void fbw() { if ((fl = fopen("lab2.dat","wb"))==NULL) { cout exit(1); }

void fbw()
{
if ((fl = fopen("lab2.dat","wb"))==NULL)
{
cout << "Oshibka pri sozdanii"<

exit(1);
}
Слайд 28

int a; do { cin >> a; int nwrt = fwrite(

int a;
do {
cin >> a;
int nwrt = fwrite(

&a, sizeof(int), 1, fl );
} while (a != -1);
fclose(fl);
}
Слайд 29

void fbsort() { if ((fl = fopen("lab2.dat","rb+"))==NULL) { cout exit(1); }

void fbsort()
{
if ((fl = fopen("lab2.dat","rb+"))==NULL)
{
cout << "Oshibka pri otritii"<

exit(1);
}
Слайд 30

for (int i=0; i for (int j=i+1; j { fseek(fl ,i*nb

for (int i=0; ifor (int j=i+1; j{
fseek(fl ,i*nb

, SEEK_SET);
nwrt = fread( &a, nb, 1, fl );
fseek(fl ,j*nb , SEEK_SET);
nwrt = fread( &b, nb, 1, fl );

int nb =sizeof(int), a, b, nwrt;
int n=filelength(fileno(fl))/nb;

Слайд 31

if (a>b) { fseek(fl ,i*nb , SEEK_SET); nwrt = fwrite( &b,

if (a>b)
{
fseek(fl ,i*nb , SEEK_SET);
nwrt = fwrite(

&b, nb, 1, fl );
fseek(fl ,j*nb , SEEK_SET);
nwrt = fwrite( &a, nb, 1, fl );
}
}
fclose(fl);
}
Слайд 32

void fbr() { if ((fl = fopen("lab2.dat","rb"))==NULL) { cout exit(1); }

void fbr()
{
if ((fl = fopen("lab2.dat","rb"))==NULL)
{
cout << "Oshibka pri otritii"<

exit(1);
}
Слайд 33

void fbr() { if ((fl = fopen("lab2.dat","rb"))==NULL) { cout exit(1); }

void fbr()
{
if ((fl = fopen("lab2.dat","rb"))==NULL)
{
cout << "Oshibka pri otritii"<

exit(1);
}
Слайд 34

int a; while(true) { int nwrt = fread( &a, sizeof(int), 1,

int a;
while(true)
{
int nwrt = fread( &a, sizeof(int),

1, fl );
if (nwrt!=1) break;
cout << a << " ";
}
fclose(fl);
}
Слайд 35

Пример 4 Написать программу, вводящую в файл или читающую из файла

Пример 4 Написать программу, вводящую в файл или читающую из файла

ведомость студентов, сдавших экзамены. Каждая структура должна содержать фамилию, а также оценки по математике и программированию. Вывести список студентов, сдавших экзамен по программированию с оценкой 4, и записать эту информацию в текстовой файл.
#include
#include
#include
#include
#include
Слайд 36

FILE *fl; typedef struct { char fio[30]; unsigned char matem; unsigned

FILE *fl;
typedef struct
{
char fio[30];
unsigned char matem;
unsigned char

oaip;
} TStudent;
TStudent stud[30]; // Массив структур
char name[20]; // Имя файла
int nst=0;// Число введенных структур
int menu(); // Меню
void nnf(); // Ввести имя файла
void newf(); // Создать новый файл
void spisok(); // Ввести список
void opf(); // Открыть файл
void resc(); // вывести результат на экран
void resf(); // Вывести результат в файл
Слайд 37

int main() { while (true) { switch (menu()){ case 1: nnf();

int main()
{
while (true) {
switch (menu()){
case 1: nnf();

break;
case 2: newf(); break;
case 3: spisok(); break;
case 4: opf(); break;
case 5: resc(); break;
case 6: resf(); break;
case 7: return 0;
default: "Viberite pravilno!";}
puts("Press any key to continue");
getch(); system("cls"); } }
Слайд 38

int menu() // Меню { cout cout cout cout cout cout

int menu() // Меню
{
cout << "VIBERITE:" << endl;
cout <<

"1. Vvod file name" << endl;
cout << "2. New file" << endl;
cout << "3. Vvesti spisok" << endl;
cout << "4. Open file" << endl;
cout << "5. Vivesti result" << endl;
cout << "6. Vivesti v fail" << endl;
cout << "7. Exit" << endl;
int i;
cin >> i;
return i;
}
Слайд 39

void nnf() // Ввести имя файла { cout cin >> name;

void nnf() // Ввести имя файла
{
cout << "Vvedite file name"

<< endl;
cin >> name;
}
void newf() // Создать новый файл
{
if ((fl = fopen(name,"wb"))==NULL)
{
cout << "Oshibka pri sozdanii"< exit(1);
}
cout << "OK" << endl;
fclose(fl);
}
Слайд 40

void spisok() // Ввести список { if ((fl = fopen(name,"rb+"))==NULL) {

void spisok() // Ввести список
{
if ((fl = fopen(name,"rb+"))==NULL)
{
cout

<< "Oshibka pri sozdanii"< exit(1);
}
cout << "Vvedite chislo studentov " << endl;
cin >> nst;
Слайд 41

for (int i=0; i { cout cin >> stud[i].fio; cout cin

for (int i=0; i {
cout << "Vvedite imya: ";

cin >> stud[i].fio;
cout << "Vvedite otcenku po matematike: ";
cin >> stud[i].matem;
cout << "Vvedite otcenku po OAiP: ";
cin >> stud[i].oaip;
fwrite( &stud[i], sizeof(TStudent), 1, fl );
}
fclose(fl);
}
Слайд 42

void opf() // Открыть файл { if ((fl = fopen(name,"rb"))==NULL) {

void opf() // Открыть файл
{
if ((fl = fopen(name,"rb"))==NULL)
{
cout <<

"Oshibka pri otkritii"< exit(1);
}
nst=0;
TStudent std;
Слайд 43

while(true) { int nwrt = fread( &std, sizeof(TStudent), 1, fl );

while(true)
{
int nwrt = fread( &std, sizeof(TStudent), 1, fl

);
if (nwrt!=1) break;
stud[nst]=std;
cout << stud[nst].fio << " " << stud[nst].matem
<< " " << stud[nst].oaip << endl;
nst++;
}
fclose(fl);
}
Слайд 44

void resc() // Вывести результат на экран { for (int i=0; i if (stud[i].oaip=='4') cout }

void resc() // Вывести результат на экран
{
for (int i=0; i

i++)
if (stud[i].oaip=='4')
cout << stud[i].fio << endl;
}
Слайд 45

void resf() // Вывести результат в файл { char namet[30]; FILE

void resf() // Вывести результат в файл
{
char namet[30];
FILE *ft;
cout <<

"Vvedite imya faila" << endl;
cin >> namet;
if ((ft = fopen(namet,"w"))==NULL)
{
cout << "Oshibka pri sozdanii "< exit(1);
}