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

Содержание

Слайд 2

4.1 Механизм выполнения ввода-вывода

typedef struct {
short level; // количество непрочитанных

4.1 Механизм выполнения ввода-вывода typedef struct { short level; // количество непрочитанных
байт в буфере
unsigned flags; // режимы: чтение/ запись/ввод/вывод и т.д.
char fd; // дискриптор файла
unsigned hold;
short bsize; // размер буфера
unsigned char *buffer; // адрес буфера
unsigned char *curp; // текущий указатель (в буфере)
unsigned istemp;
short token; } FILE;

Файл

Буфер

Программа

Файл

Файловый указатель

Слайд 3

4.2 Объявление, открытие и закрытие файлов

Объявление
FILE *<Файловая переменная (Ф.п.)>;
Открытие
<Ф. п.>=fopen(<Имя файла>,<Операция

4.2 Объявление, открытие и закрытие файлов Объявление FILE * ; Открытие =fopen(
[+] [Тип]>);
:
r - ввод из существующего файла;
w - вывод с очисткой файла или создание нового файла для вывода;
a - добавление к существующему или создание файла для вывода;
r+ - ввод/вывод в существующий файл;
w+ - ввод/вывод в существующий или создание нового файла;
a+ - ввод/добавление к существующему или создание файла для
ввода/вывода.
<Тип> - t - текстовый файл (принимается по умолчанию);
b - двоичный файл.
Закрытие
fclose(<Ф. п.>);

Слайд 4

Примеры открытия/закрытия файлов

а) объявление и открытие существующего или нового двоичного файла для

Примеры открытия/закрытия файлов а) объявление и открытие существующего или нового двоичного файла
ввода/вывода
FILE *f;
f=fopen("abc.txt","w+b");

fclose(f);
б) объявление и открытие существующего файла с проверкой существования
FILE *f;
if ((f=fopen("f:\\iva\\text.txt", "r"))!=NULL) …

fclose(f);

Слайд 5

4.3 Файловый указатель. Функции управления файловым указателем

а) определение положения файлового указателя:
long ftell(FILE *stream);

4.3 Файловый указатель. Функции управления файловым указателем а) определение положения файлового указателя:

б) установка файлового указателя на начало файла:
int rewind(FILE *stream);
в) установка файлового указателя в произвольное место:
int fseek(FILE *stream,long offset,int whenсe);

Слайд 6

4.4 Текстовые файлы

1-2. Ввод/вывод символов
int getc(FILE *stream); //возвращает символ или EOF(-1)
int putc(int

4.4 Текстовые файлы 1-2. Ввод/вывод символов int getc(FILE *stream); //возвращает символ или
c,FILE *stream);
Пример. Вывод на экран содержимого файла (Ex4_01), полное имя которого указывается в командной строке.
#include
int main(int argc,char *argv[ ])
{ FILE *in; int ch;
if (argc<2)puts("Enter file name.");
else
if ((in=fopen(argv[1],"r"))!=nullptr)
{ while ((ch=getc(in))!=EOF) putchar(ch);
fclose(in);
}
else puts("No open file.");
return 0; }

Слайд 7

Стандартные текстовые файлы

stdin, stdout, stderr
getchar( ) = = getc(stdin)
putchar(ch) =

Стандартные текстовые файлы stdin, stdout, stderr getchar( ) = = getc(stdin) putchar(ch)
= putc(ch,stdout)
Пример. Чтение с начала и с конца (Ex4_02).
#include
int main()
{ FILE *f; long offset=0L; int ch;
f=fopen("D:\\Ex2022\\Ex4_02\\test.dat","r");
while ((!fseek(f,offset++,0)) && ((ch=getc(f))!=EOF))
{ putc(ch,stdout);
if (!fseek(f,-(offset+2),2)) putc(getc(f),stdout);
}
fclose(f);
return 0;
}

ABCD

ADBCCBDA

Слайд 8

Буферированные и «прямые» операции

stdio.h: getchar(), putchar() – буферированные операции;
conio.h: getch() –

Буферированные и «прямые» операции stdio.h: getchar(), putchar() – буферированные операции; conio.h: getch()
прямой ввод без копирования на экран,
getche() – тоже, но копирует на экран вводимый символ,
putch() – прямой вывод символа на экран.
Примеры (Ex4_03):
а) while((n=getchar())!='E'){putchar('\n'); putchar(n);}
б) while ((n=getche())!='E') {putch('\n'); putch(n); }

A↵
AB↵
BC↵
CE

ABCE

A↵
B↵
C

Слайд 9

3. Вывод строк

int fputs(const char *s,FILE *stream);
Пример. Создание файла из 6

3. Вывод строк int fputs(const char *s,FILE *stream); Пример. Создание файла из
строк (Ex4_04).
#include
int main()
{ FILE *f; int n;
const char *s="ABCD";
f=fopen("test.dat","w");
for (n=0;n<6;n++)
{ fputs(s,f);
fputs("\n",f);
}
fclose(f);
return 0;
}

ABCD↵ABCD↵ABCD↵ABCD↵ABCD↵ABCD↵

Слайд 10

4. Ввод строк

char *fgets(char *s, int n, FILE *stream); // возвращает адрес

4. Ввод строк char *fgets(char *s, int n, FILE *stream); // возвращает
строки или NULL
Пример. Чтение файла по строкам (Ex4_05).
#include
int main()
{
FILE *f1;
char string[80];
f1 = fopen("test.dat", "r");
while (fgets(string, 80, f1) != nullptr)
puts(string);
return 0;
}

41

42

43

44

00

string

A B C D \n \0

..

Слайд 11

5-6. Форматный ввод/вывод

int fscanf(FILE *stream,const char *format[,adress,...]);
int fprintf(FILE *stream,const char *format[,argument,.]);
Пример.

5-6. Форматный ввод/вывод int fscanf(FILE *stream,const char *format[,adress,...]); int fprintf(FILE *stream,const char
Создание и распечатка файла чисел (Ex4_06).
#include
#include
#include
int main()
{ int i,r; FILE *f;
srand(static_cast(time(nullptr)));
f=fopen("rand1.dat","w+");
for (i=0;i<7;i++){r=rand(); fprintf(f,"%d ",r);}
rewind(f);
while (fscanf(f,"%d",&r)!=EOF)printf("%6d",r);
fclose(f);
return 0;
}

3684 20574 6789 23678 4578 9842 31567

Слайд 12

Очистка буфера ввода

Пример (Ex4_11):
#include
int main() {
int i;

Очистка буфера ввода Пример (Ex4_11): #include int main() { int i; char

char string[81];
printf("Enter with scanf: ");
for(i= 0;i<3;i++){
scanf("%s",string); // не вводит Enter!
printf("%s\n",string);
}
// Необходимо освободить буфер, содержащий код Enter !!!
while (getchar() != '\n');
printf("Enter gets: " );
gets(string);
printf("%s\n", string );
}

Enter with scanf: rrr ttt yyy↵
rrr
ttt
yyy
Enter with gets: rrr ttt yyy↵
rrr ttt yyy

Слайд 13

4.5 Двоичные файлы

Ввод/вывод
size_t fread(void *ptr,size_t size,size_t n,
FILE *stream);
size_t fwrite(void

4.5 Двоичные файлы Ввод/вывод size_t fread(void *ptr,size_t size,size_t n, FILE *stream); size_t
*ptr,size_t size,size_t n,
FILE *stream);
Используются в двух вариантах:
а) при работе со структурами
fread (&myrec, sizeof(myrec),1,f1);
fwrite (&myrec, sizeof(myrec),1,f1);
где myrec - переменная типа «структура»;
б) при работе с нетипизированной информацией
fread(&buffer,1,sizeof(buffer),f2);
fwrite(&buffer,1,sizeof(buffer),f2);
где buffer – массив байт.

Слайд 14

Пример работы с двоичным файлом

Создание файла записей "Название игрушки, стоимость"
(Ex4_07)
#include
#include
struct

Пример работы с двоичным файлом Создание файла записей "Название игрушки, стоимость" (Ex4_07)
toys{ char name[20];int cost;};
int main() {
FILE *f;
toys toy;
f=fopen("test.dat","w+b");
while(scanf("\n%s",toy.name),
strcmp(toy.name,"end")!=0) {
scanf("%d",&toy.cost);
fwrite(&toy,sizeof(toy),1,f);
}
fclose(f);
}

Слайд 15

Пример работы с двоичным файлом (2)

Чтение и вывод на экран файла записей

Пример работы с двоичным файлом (2) Чтение и вывод на экран файла
"Название игрушки, стоимость"(Ex4_08)
#include
struct toys{ char name[20]; int cost;};
int main()
{
FILE *f;
toys toy;
f=fopen("test.dat","r+b");
while(fread(&toy,sizeof(toy),1,f)>0)
printf("Toy name %s - cost - %d\n",toy.name,toy.cost);
fclose(f);
return 0;
}

Слайд 16

Чтение текстового файла как двоичного

Создание текстового файла и чтение его как файла

Чтение текстового файла как двоичного Создание текстового файла и чтение его как
символов(Ex4_09)
#include
int main()
{ char c;
FILE *f;
f=fopen("ddd.dat","w");
fputs("ABCDEF",f);
fclose(f);
f=fopen("ddd.dat","rb");
while (fread(&c,1,1,f)!=0)
printf("%c ",c);
fclose(f);
return 0;
}

A B C D E F