Ввод-вывод - файлы. Программа: логические файлы. Операционная и файловая системы: физические файлы

Содержание

Слайд 2

Логические файлы Являются объектами программы и обеспечивают связь с физическими файлами

Логические файлы

Являются объектами программы и обеспечивают связь с физическими файлами
Скрывают особенности

реализации разных видов файлов
Могут в разные моменты времени исполнения быть связаны с разными физическими файлами
Слайд 3

Ввод/вывод – связь с языком Специальные конструкции языка (Fortran) READ (f,2)

Ввод/вывод – связь с языком

Специальные конструкции языка (Fortran)
READ (f,2) (X(I),

I=1,100)
2 FORMAT (16F5,1)
Псевдо-процедуры (Pascal)
Write(f, x:6:2, ‘ + ‘, y:6:2,
‘ = ‘, x+y :7:2);
WriteLn(f);

Элементарные процедуры (Modula-2)
FWriteFloat(f, x, 6, 2);
FWriteString(f, ’ + ‘);
FWriteFloat(f, y, 6, 2);
FWriteString(f, ’ = ‘);
FWriteFloat(f, y, 7, 2);
FWriteLn(f);
Процедуры форматного вывода (C)
fprintf(f,
”%6.2f + %6.2f = %7.2f\n”,
x, y, x+y);

Слайд 4

Ввод/вывод – связь с языком Специальные конструкции языка Богатые (но фиксированные)

Ввод/вывод – связь с языком

Специальные конструкции языка
Богатые (но фиксированные) возможности
Нет накладных

расходов на вызов
Библиотечные процедуры
Минимизация языковых концепций
Подключается только при необходимости
Слайд 5

Низкоуровневый ввод/вывод #include // создание файла int creat( char *filename, int

Низкоуровневый ввод/вывод

#include
// создание файла int creat( char *filename, int permission);
// открытие

файла int open( char *filename, int access, int permission );
// чтение из файла в буфер int read( int handle, void *buffer, int nbyte );
// запись из буфера в файл int write( int handle, void *buffer, int nbyte );
// установка текущей позиции long lseek(int handle, long offset, int whence);
// закрытие файла – освобождение ресурсов int close( int handle );
// удаление файла int unlink( char *filename );
Слайд 6

Низкоуровневый ввод/вывод #include int fd; char buffer[10]; fd = open( "C:\Univ\Reports\2009\Пересдача.txt

Низкоуровневый ввод/вывод

#include
int fd;
char buffer[10];
fd = open( "C:\Univ\Reports\2009\Пересдача.txt ", O_RDONLY |

O_TEXT );
lseek(fd,4,SEEK_SET);
read(fd, buffer, 10);
close(fd);


fd:

buffer:

Слайд 7

Низкоуровневый ввод/вывод Системные вызовы – дорогая операция Код ответа (м.б. непривычно):

Низкоуровневый ввод/вывод

Системные вызовы – дорогая операция
Код ответа (м.б. непривычно):
0 – всё

нормально
номер причины неудачи, иначе
Поддерживает только вывод байтов и текста; нет чисел, строк и т.д.
Использовать только в крайнем случае!
Слайд 8

Буферизованный ввод/вывод #include // открытие файла FILE *fopen(char *filename, char *mode);

Буферизованный ввод/вывод

#include
// открытие файла FILE *fopen(char *filename, char *mode);
mode ==

“r” – чтение
mode == “w” – запись
mode == “a” – дозапись
// чтение из файла count элементов размера size long fread(void* ptr, long size, long count, FILE * stream);
// запись в файл count элементов размера size long fwrite(void* ptr, long size, long count, FILE * stream);
// установка текущей позиции int fseek(FILE * stream, long offset, int origin);
// установка текущей позиции long ftell(FILE * stream);
// закрытие файла – освобождение ресурсов int fclose(FILE * stream);
Слайд 9

Буферизованный ввод/вывод FILE * f; char bname[8], bmarks[6]; f = fopen("C:\Univ\Reports\2009\Пересдача.txt

Буферизованный ввод/вывод

FILE * f;
char bname[8], bmarks[6];
f = fopen("C:\Univ\Reports\2009\Пересдача.txt ", “r”);
fread(bname,7,1,f);
fread(bmarks,6,1,f);
fclose(f);


fd:

buffer:

f:

bname:

bmarks:

Слайд 10

Буферизованный ввод/вывод fread, fwrite могут быть значительно эффективнее read и write

Буферизованный ввод/вывод

fread, fwrite могут быть значительно эффективнее read и write
fread, fwrite

уместны для работы с «бинарными» данными, для которых точно известен размер
Типичные ошибки:
незакрытие файла
чтение из закрытого файла
повторное закрытие файла
несоответствие размера данных
Слайд 11

Посимвольный и посторочный ввод/вывод FILE * in, * out; in =

Посимвольный и посторочный ввод/вывод

FILE * in, * out;
in = fopen(“in.txt”, “r”);
out

= fopen(“out.txt”, “w”);
int c;
while ((c=fgetc(in) != EOF)
fputc(c,out);
fclose(in);
fclose(out);

FILE * in, * out;
in = fopen(“in.txt”, “r”);
out = fopen(“out.txt”, “w”);
char buf[N];
while ((fgets(buf,N,in)) != NULL)
fputs(buf,out);
fclose(in);
fclose(out);

fgetc вызывается большее количество раз
fgets делает анализ строки

Слайд 12

Стандартные файлы stdin – стандартный ввод stdout – стандартный вывод stderr

Стандартные файлы

stdin – стандартный ввод
stdout – стандартный вывод
stderr – файл ошибок
Перенаправление

ввода/вывода
My1stProg.exe < StudentData.txt > Report.txt
Типичная ошибка
fclose(stdout);
(кто создаёт, тот и удаляет)
Слайд 13

Форматный ввод/вывод (пример) Стипендия 2700 Долг -300 Телефон -500 Одежда -750

Форматный ввод/вывод (пример)

Стипендия 2700 Долг -300 Телефон -500 Одежда -750 Еда -123.50 Долг 500

Входные данные:

Выходной отчёт:

Слайд 14

Форматный ввод/вывод (Pascal) Специальный синтаксис фактических параметров в псевдопроцедурах Write, WriteLn WriteLn(out, comment:20, amount:10:2, balance:10:2); аргументы:

Форматный ввод/вывод (Pascal)

Специальный синтаксис фактических параметров в псевдопроцедурах Write, WriteLn
WriteLn(out, comment:20, amount:10:2,

balance:10:2);

аргументы:

Слайд 15

Форматный ввод/вывод (С) // вывод в файл int fprintf(FILE * stream,

Форматный ввод/вывод (С)

// вывод в файл int fprintf(FILE * stream, char *

format, ... );
// вывод в stdout int printf(char * format, ... );
// чтение из файла int fscanf(FILE * stream, char* format, ... );
// чтение из stdin int scanf(char * format, ... );
Слайд 16

Формат вывода

Формат вывода

Слайд 17

Форматный ввод/вывод (пример) void main() { FILE * in = …

Форматный ввод/вывод (пример)

void main() { FILE * in = … FILE * out

= …;
char comment[128]; float amount; float balance = 0.0;
char header_fmt[] = “%20s%10s%10s%10s%20s\n”; char income_fmt[] = “%-20.20s%+10.2f%+10.2f%10s%20s\n”; char expense_fmt[] = “%20s%10s%+10.2f%+10.2f%-20.20s\n”;

fprintf(out, header_fmt, “Приход”, “Сумма”, “Баланс”, “Сумма”,”Расход”); while (fscanf(in,”%s%f”, comment,&amount) == 2) { balance += amount; if (amout >= 0) fprintf(out, income_fmt, comment, amount, balance, “”,””); else fprintf(out, income_fmt, “”,””, balance, -amount, comment); } fclose(in); fclose(out); }

Слайд 18

Форматирование строк // «вывод» в строку int sprintf(char * src, char

Форматирование строк

// «вывод» в строку int sprintf(char * src, char * format,

... );
// «чтение» из строки int sscanf(char * src, char* format, ... );
Слайд 19

sprintf Пример: центрированная печать void WriteCenterString(char * s, int p) {

sprintf

Пример: центрированная печать

void WriteCenterString(char * s, int p) { char fmt[20]; int

l = strlen(s); // если не помещается, // увеличиваем p if (p < l) p = l; l += (p - l) / 2; sprintf(fmt, “%%%ds%%%ds”, l, p-l); // например, при l=4, p=20 // имеем p2=8, fmt = “%12s%8s” printf(fmt, s,””); }

void WriteCenterFloat(float x, int p) { // xstr – текстовое предствление x char xstr[20]; sprintf(xstr, “%f”, x); WriteCenterString(xstr,p); }

Слайд 20

Вывод/вывод указателей root: struct Person { struct Person * Parent; char

Вывод/вывод указателей

root:

struct Person { struct Person * Parent;
char Name[32]; unsigned int

ChildrenCount;
struct Person * Children;
} * root, * child;
fwrite (&root,1,sizeof(root),f);

В файл попадёт 4 байта

Слайд 21

Вывод/вывод указателей root: struct Person { struct Person * Parent; char

Вывод/вывод указателей

root:

struct Person { struct Person * Parent;
char Name[32]; unsigned int

ChildrenCount;
struct Person * Children;
} * root, * child;
fwrite(&root,1,sizeof(root),f);
fwrite(root,1,sizeof(*root),f);
fwrite(root->Children,2, sizeof(struct Person *),f);
fwrite(root->Children[0],1, sizeof(struct Person),f);
fwrite(root->Children[1],1, sizeof(struct Person),f);

Запишется всё, но...

Слайд 22

Вывод/вывод указателей root: struct Person { struct Person * Parent; char

Вывод/вывод указателей

root:

struct Person { struct Person * Parent;
char Name[32]; unsigned int

ChildrenCount;
struct Person * Children;
} * root, * child;
fread(&root,1,sizeof(root),f);
fread(root,1,sizeof(*root),f);
fread(root->Children,2, sizeof(struct Person *),f);
fread(root->Children[0],1, sizeof(struct Person),f);
fread(root->Children[1],1, sizeof(struct Person),f);

Считаются ссылки на несуществующие объекты

Слайд 23

Ввод/вывод указателей - cпециализированные процедуры struct Person { struct Person *

Ввод/вывод указателей - cпециализированные процедуры

struct Person { struct Person * Parent;
char Name[32];

unsigned int ChildrenCount;
struct Person * Children;
} * root, * child;

void SavePerson(struct Person *p, FILE * f)
{ fwrite(p,1,sizeof(*p),f); for (int i = 0; iChildrenCount; i++) SavePerson(p->Children[i], f);
}
struct Person * LoadPerson(FILE * f)
{
struct Person * p; new(p); fread(p,1,sizeof(*p),f);
if (p->ChildrenCount > 0)
{
newarray(p->Children, p->ChildrenCount); for (int i = 0; iChildrenCount; i++) { p->Children[i] = LoadPerson(f); p->children[i]->Parent = p;
}
}
return p;
}

Сохраняется лишнее
Предполагается отсутствие циклов