176.00K
Категория: ПрограммированиеПрограммирование

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

1.

Файлы

2.

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

3.

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

4.

Для
обработки
любого
файла
необходимо выполнить следующие
действия:
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 = 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 на size
байт в направлении code :
0 – смещение от начала;
1 – смещение от текущей позиции;
2 – смещение от конца файла.
Смещение может быть как положительным, так и
отрицательным, но нельзя выходить за пределы
файла.
В случае успеха функция возвращает 0, 1 –
при ошибке, например, выход за пределы файла.
Доступ к файлу с использованием этой
функции называют произвольным доступом.

17.

Рассмотрим некоторые полезные функции:
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 <iostream.h>
#include <stdio.h>
#include <string.h>
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 != 0 )
{
fgets( load_string, 50 , file );
cout << "load_string = " << load_string << endl;
}
else
{
cout << "File not found !!!" << endl;
}
fclose(file);
}

20.

Пример 2 Создать программу, в которой
реализованы создание, добавление и просмотр
файла, содержащего информацию о фамилии и
среднем балле студентов. Процесс добавления
информации заканчивается при нажатии точки.
#include <stdio.h>
#include <stdlib.h>
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)
{
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+");
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) {
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, char *kod)
{
FILE *f;
if(!(f = fopen(file, kod))) {
puts("Open File Error!");
exit(1);
}
return f;
}

25.

Пример 3 Открыть файл и записывать туда
все вводимые с клавиатуры числа, до тех пор,
пока
не
будет
введено
число
-1.
Отсортировать
данные
в
файле
по
возрастанию.
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
FILE *fl;
void fbw();
void fbsort();
void fbr();

26.

int main()
{
fbw(); // Запись в файл
fbsort(); // Сортировка в файле
fbr(); // Чтение из файла
return 0;
}

27.

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

28.

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 << "Oshibka pri otritii"<<endl;
exit(1);
}

30.

int nb =sizeof(int), a, b, nwrt;
int n=filelength(fileno(fl))/nb;
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; 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 );

31.

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 << "Oshibka pri otritii"<<endl;
exit(1);
}

33.

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

34.

int a;
while(true)
{
int nwrt = fread( &a, sizeof(int), 1, fl );
if (nwrt!=1) break;
cout << a << " ";
}
fclose(fl);
}

35.

Пример 4 Написать программу, вводящую в файл
или читающую из файла ведомость студентов,
сдавших экзамены. Каждая структура должна
содержать фамилию, а также оценки по математике
и программированию. Вывести список студентов,
сдавших экзамен по программированию с оценкой 4,
и записать эту информацию в текстовой файл.
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

36.

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

40.

void spisok()
// Ввести список
{
if ((fl = fopen(name,"rb+"))==NULL)
{
cout << "Oshibka pri sozdanii"<<endl;
exit(1);
}
cout << "Vvedite chislo studentov " << endl;
cin >> nst;

41.

for (int i=0; i<nst; 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)
{
cout << "Oshibka pri otkritii"<<endl;
exit(1);
}
nst=0;
TStudent std;

43.

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<nst; i++)
if (stud[i].oaip=='4')
cout << stud[i].fio << endl;
}

45.

void resf()
// Вывести результат
в файл
{
char namet[30];
FILE *ft;
cout << "Vvedite imya faila" << endl;
cin >> namet;
if ((ft = fopen(namet,"w"))==NULL)
{
cout << "Oshibka pri sozdanii "<<endl;
exit(1);
}

46.

char s[80];
for (int i=0; i<nst; i++)
if (stud[i].oaip=='4')
{
strcpy(s, stud[i].fio);
strcat(s, "\n");
// Добавление разделителя строк
fputs(s, ft);
}
fclose(ft);
}
English     Русский Правила