Similar presentations:
Файлы. Текстовые и бинарные файлы
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);
}