217.35K
Category: programmingprogramming

Организация работы с файлами

1.

Лекция 1

2.

Основные определения
В языках программирования понятие файла
употребляется в двух смыслах:
• как поименованная область информации на
внешнем устройстве (внешний файл);
• как переменная файлового типа в программе
(внутренний файл).

3.

Основные определения
Все элементы файла считаются пронумерованными,
начальный элемент имеет нулевой номер.
0
1
2

F1
F2
F3

текущий указатель
F1, F2, F3… - элементы файла
МК - маркер конца
МК

4.

Основные определения
Любой файл имеет три характерных особенности:
у него есть имя, что дает возможность программе
работать одновременно с несколькими файлами;
он содержит компоненты определенного типа;
длина вновь создаваемого файла никак не
оговаривается
при
его
объявлении
и
ограничивается только емкостью устройств
внешней памяти.

5.

Основные определения
Файловый тип переменной — это структурированный тип, представляющий
собой совокупность однотипных элементов, количество которых заранее (до
исполнения программы) не определено.
Хранит идентификатор файлового потока и информацию, которая нужна, для
управления: указатель на буфер, индикаторы позиции в файле и состояния.

6.

Основные определения
Задание переменной файлового типа:
<имя> = FILE OF <тип>;
<имя> = TEXT;
<имя> = FILE;
type
product = record;
name: string; code: word; cost: comp
end;
text80 = file of string [80];
var
f1: file of char; f2: text;
f3: file; f4: text80;
f5: file of product;
FILE *имя;
FILE *fp;
FILE *f = NULL;

7.

Основные определения
Файлы
По типу
типизированные
По методу
доступа
Последовательного доступа
текстовые
Прямого
доступа
бинарные

8.

Алгоритм, рекомендуемый при
работе с файлами.
установить соответствие между файлом и
файловой переменной;
2. открыть файл с определенной целью (чтение,
запись);
3. работа с файлом;
4. закрытие файла.
1.

9.

Операции чтения и записи

10.

Процедуры и функции для всех типов файлов
ASSIGN(F,NAME);
Связь файловой переменной F с внешним файлом
NAME.
Данную процедуру нельзя использовать для уже
открытого файла.
CLOSE(F);
Закрытие открытого файла.
ERASE(F);
RENAME(F,NEWNAME);
RESET(F);
REWRITE(F);
EOF(F);
IOResult()
Процедура, удаляющая неоткрытый внешний
файл любого типа, задаваемый переменной F.
Удаление осуществляется только для реально
существующего файла.
Переименование внешнего файла.
Осуществляется только для уже реально
существующего файла.
Инициализирует открытие уже существующего
файла, с которым связна файловая переменная F, и
указатель
текущего
компонента
файла
настраивается на начало файла.
Инициализирует открытие пустой файл, и ему
присваивает имя, заданное процедурой ASSIGN.
{$I-}reset (f);{$I+}
Конец файла
if IoResult<>0 then begin
Возвращает целое
число, соответствующее коду
writeln ('Не могу открыть файл ');
последней ошибки ввода - вывода.

11.

Текстовые файлы
Текстовые файлы представляют собой последовательность строк, а строки последовательность символов. Строки имеют переменную длину, каждая
строка завершается признаком конца строки.
FLUSH(F);
Открытие файла для добавления
информации
Отображает буфер выходного файла.
READ(F, <список>);
READLN(F, <список>);
SETTEXTBUF(F,BUF, BufSize);
Чтение из файла
Чтение строки из файла
Назначение буфера ввода-вывода.
WRITE(F, <список>);
WRITELN(F, <список>);
EOLN(F);
SEEKEOF(F);
SEEKEOLN(f);
Запись в файл
Запись строки в файл
Конец строки файла
Конец файла
Конец строки файла.
Пропускает в конце строки символы пробела и
табуляции.
APPEND(F);
в
конец

12.

Считать данные из первого файла, и записать их во
второй файл, удвоив каждый элемент через пробел.
Var f1, f2: text;
x: char;
st:string;
begin
write(‘Введите имя файла: ’);
readln(st);
assign(f1, st);
reset(f1);
assign(f2,’result.txt’);
rewrite(f2);
while not eof (f1) do
begin
read(f1,x);
write(f2, x + ‘ ‘ + x );
end;
close(f1);
close(f2);
end.

13.

Просмотр любого текстового файла на экране. По
заполнении экрана до 24 строк программа делает паузу.
var f:text; s:string; count:integer;
begin
repeat
write ('Имя файла или 0 для выхода: ');
readln (s);
if s='0' then halt;
assign (f,s);
{$I-}reset (f);{$I+}
if IoResult<>0 then begin
writeln ('Не могу открыть файл ',s);
write ('Нажмите Enter для
продолжения');
readln;
continue;
end;
count:=1;
while not eof(f) do begin
readln (f,s);
writeln (s);
count:=count+1;
if count=24 then begin
count:=1;
write('Нажмите Enter для продолжения');
readln;
end;
end;
write ('Нажмите Enter для нового ввода');
readln;
close (f);
until false;
end.

14.

Пример работы с числовыми данными
Assign(f1,'File1.dan’);
ReWrite(f1);
Writeln(f1,'Значения "X","Y"' );
{ начать запись }
For i:= 1 to N do
begin
X:= 0.5*i;
Y:= Ln(X);
write(f1, X:6:2, Y:10:4);
If i mod 5 = 0 then writeln(f1)
{ записать символ #13 }
end;
Close(f1);
Assign(f2,'File1.dan');
Reset(f2);
Readln(f2); { пропустить первую
строчку }
For i:= 1 to N do
begin
read(f2, a[i], b[i]);
If i mod 5 = 0 then readln(f2)
{ считать символ #13 }
end;
Close(f2);

15.

Пример программы для считывания строковых и
числовых данных из файла и записи их в другой файл
var
c: char; j, i: word;
s: array[1..10] of string[12];
a: array[1..10, 1..6] of word;
f1, f2: text;
BEGIN
assign(f1, 'F1.txt'); reset(f1);
assign(f2, 'F2.txt'); rewrite(f2);
for i:= 1 to 10 do
begin
read(f1, s[i]);
for j:= 1 to 6 do read(f1, a[i,j]);
readln(f1) {конца строки }
end;
Файл cодержит информацию вида
Леонтьев 5 4 4 5 4 3
Ивлев 4 5 3 4 3 4
и т. д.
for c:= 'А' to 'Я' do
for i:= 1 to 10 do
if s[i,1] = c then
begin
write(f2, s[i]);
for j:= 1 to 6 do write(f2, a[i,j]:2);
writeln(f2) {маркер конца строки }
end;
close(f1);
close(f2);
END.

16.

Процедуры и функции для всех типов файлов Си
FILE *fopen (const char *filename, filename

название
const char *mode);
int fclose(FILE * f);
файла.
mode – режим открытия
Функция возвращает указатель на файл, если
тот был успешно открыт. В противном случае –
NULL
Закрытие открытого файла. f - указатель на
открытый файл
int remove(const char *filename); Удаление
осуществляется только
реально существующего файла.
для
int rename(const char *fname, Переименование внешнего файла.
Осуществляется только для уже реально
const char *nname);
int feof(FILE *f);
существующего файла.
Конец файла
Функция возвращает:
0 – если конец файла еще не достигнут.
!0 – достигнут конец файла.
void setbuf (FILE * f, char * buffer)
int fflush(FILE *f);
Назначение буфера открытому файлу
Принудительная очистка буфера файла.

17.

Тип
Описание
r
Чтение. Файл должен существовать.
w
Запись нового файла. Если файл с таким именем уже существует, то
его содержимое будет потеряно.
a
Запись в конец файла. Файл создаётся, если не существовал.
r+
Чтение и обновление. Можно как читать, так и писать. Файл должен
существовать.
w+
Запись и обновление. Создаётся новый файл. Если файл с таким
именем уже существует, то его содержимое будет потеряно. Можно
как писать, так и читать.
a+
Запись в конец и обновление. Операции позиционирования
работают только для чтения, для записи игнорируются. Если файл
не существовал, то будет создан новый.

18.

Текстовые файлы Си
int fscanf(FILE *stream,
const char * format,
[arg] ...);
Форматированное чтение.
Возвращает:
>0 – число успешно прочитанных переменных,
0 – ни одна из переменных не была успешно
прочитана,
EOF – ошибка или достигнут конец файла.
char * fgets(char *
buffer, int maxlen, FILE
*stream);
Чтение строки
возвращает buffer – все нормально,
NULL – ошибка или достигнут конец файла.
int fgetc(FILE *stream);
Чтение символа
возвращает код символа – если все нормально,
EOF – если ошибка или достигнут конец файла.
int fprintf(FILE *stream, Форматированный вывод
const char *format,
возвращает:
[arg] ...);
число записанных символов – если все нормально,
отрицательное значение – если ошибка.
int fputs(const char
*string, FILE *stream);
Запись строки
возвращает: число записанных символов – все
нормально,EOF – произошла ошибка.

19.

В файле записаны целые числа. Найти максимальное из них.
int main( ){
FILE *input = NULL;
int num, maxn;
input = fopen("input.txt", "rt");
if (input == NULL) {
printf("Error opening file");
_getch();
exit(ERROR); }
maxn = INT_MIN;
while (!feof(input)) {
fscanf(input, "%d", &num);
if (num > maxn) maxn = num; }
printf("max number = %d", maxn);
fclose(input);
_getch();
}

20.

В файле записаны слова: русское слово, табуляция, английское слово, в несколько строк.
Пользователь вводит английское слово, необходимо вывести русское.
Файл с переводом сохранён в кодировке cp866 и выглядит примерно так
солнце sun
карандаш pen
дверь door
окно windows
стул chair
При этом важно: последняя пара слов также заканчивается переводом строки.
printf("enter word: ");
fgets(usrWord, 50, stdin);
void main() {
wasFound = 0;
FILE *input = NULL;
while (!feof(input))
char buffer[512];
{
char enWord[50], ruWord[50],
fgets(buffer, 50, input);
usrWord[50];
length = strlen(buffer);
unsigned index;
for (index = 0; index < length; index++)
int length, wasFound;
{
if (buffer[index] == '\t')
input = fopen("input.txt", "r");
{
if (input == NULL)
buffer[index] = '\0';
{
break;
printf("Error opening file");
}
if (wasFound) {
_getch();
}
printf("%s", ruWord);
exit(ERROR);
strcpy(ruWord, buffer);
} else {
}
strcpy(enWord, &buffer[index + 1]);
printf("Word not found");
if (!strcmp(enWord, usrWord)) {
}
wasFound = 1;
fclose(input);
break;
_getch();
}
}
}

21.

Дан текстовый файл, содержащий в строках целые числа (максимальная длина строки –
100 символов). Вычислить сумму чисел в каждой строке и записать в новый файл.
int main(int argc, char *argv[])
{
FILE *f = NULL, *f1 = NULL;
f = fopen(" input.txt ","r");
if(!f) {printf("Файл не найден!\n"); return 1;}
f1 = fopen(" output.txt ","w");
if(!f1) {
printf("Can\'t create file!\n");
fclose(f); return 1;
}
while(!feof(f)){
char str[100] = "";
fgets(str,100,f);
char *ptr = strtok(str," \t");
int sum = atoi(ptr);
while((ptr = strtok(NULL," \t")) != NULL)
sum += atoi(ptr);
fprintf(f1,"%d\n",sum);
}
fclose(f); fclose(f1);
return 0;
}

22.

Бинарные файлы ПАСКАЛЬ
содержит данные в двоичном формате, а не текстовом. В отличие от
текстовых файлов, в бинарных файлах каждый байт имеет
конкретное значение, которое может интерпретироваться поразному в зависимости от контекста
var f: File;
Reset(var f: File; BufSize: Word );
Rewrite(var f: File; BufSize: Word );
BlockRead( var f: File; var X; Count: Word; var QuantBlock: Word );
BlockWrite( var f: File; var X; Count: Word; var QuantBlock: Word );

23.

Программа выполняет ввод вещественных чисел из
текстового файла и запись их в бинарный файл блоками по
четыре числа.
var buf : array[1 .. 4] of real;
f_in : text; f_out: file;
i, k : integer;
name_in, name_out : string;
begin
{$I-} writeln(‘ Имя входного файла');
readln(name_in);
assign(f_in, name_in); reset(f_in);
if IOResult <>0 then begin
writeln('Файл ', name_in,' не найден');
exit
end;
writeln(‘Имя выходного файла');
readln(name_out);
assign(f_out, name_out);
rewrite(f_out, sizeof(real) * 4);
{$I+}
i := 0;
while not eof(f_in) do begin
inc(i);
read(f_in, buf[i]);
if i = 4 then begin
blockwrite(f_out, buf, 1); i := 0; end;
end;
if i <> 0 then begin
for k := i + 1 to 4 do buf[k] := 0;
blockwrite(f_out, buf, 1);
end;
close(f_in);
close(f_out);
end.

24.

Бинарные файлы СИ
открыть его с помощью функции fopen, используя
режимы: rb, wb, ab, rb+, wb+ или ab+
FILE *fp;
fp = fopen("file.bin", "rb");
Функция возвращает указатель на файл или NULL, в случае
ошибки открытия
Чтение
int buffer[100];
int count= fread(buffer, size_block, num_block, fp);
Функция возвращает количество прочитанных блоков. Если
оно меньше num_block, то произошла ошибка или достигнут
конец файла
Запись
int count = fwrite(buffer, size_block, num_block, fp);

25.

Операции прямого доступа к файлу СИ
long int ftell(FILE *f);
Чтение текущей позиции в файле
int fseek(FILE *f, long int
offset, int origin);
Изменение текущей позиции от
int fgetpos(FILE *f, fpos_t
*pos);
Чтение текущей позиции в файле Структура
fpos_t используется для хранения позиции
индикатора позиции в файле
int fsetpos(FILE *f, const
fpos_t *pos);
Установка текущей позиции в файле.
origin принимает значения:
SEEK_SET или 0 – от начала файла.
SEEK_CUR или 1 – от текущей позиции.
SEEK_END или 2 – от конца файла.

26.

Операции прямого доступа к файлу ПАСКАЛЬ
FileSize( var f ): Longint
возвращает количество блоков в
открытом файле f.
FilePos( var f ): Longint
возвращает текущую позицию в файле
f.
Seek ( var f; N: Longint)
обеспечивает назначение текущей
позиции в файле (позиционирование).
Truncate( var f )
устанавливает в текущей позиции
признак конца файла и удаляет
(стирает) все последующие блоки.

27.

Дан бинарный файл, содержащий положительные вещественные числа. Найти
максимум и минимум, поменять их в файле местами.
int main(int argc, char *argv[])
{
FILE *f = NULL;
f = fopen(" 1.bin "); ,"rb+");
if(!f) {printf("Файл не найден!\n"); return 1;}
double max, min, val;
int imax = 0, imin = 0, i = 1;
fread(&val,sizeof(double),1,f);
max = min = val;
while(!feof(f)){
fread(&val,sizeof(double),1,f);
if(val > max) {max = val; imax = i;}
if(val < min) {min = val; imin = i;}
i++;
}
fseek(f,imax*sizeof(double),0);
fwrite(&min,sizeof(double),1,f);
fseek(f,imin*sizeof(double),0);
fwrite(&max,sizeof(double),1,f);
fclose(f); return 0;
}

28.

Типизированный файл
- это файл с объявленным типом его компонент.
type
FIO= String[20];
SPISOK=File of FIO;
var
STUD, PREP: SPISOK;
fsimv: File of Char;
fr: File of Real;

29.

Представление информации в файле
type
Person = record
Name: String[10];
Gender: Char;
Age:Byte;
end;
PersonFile: file of Person;
PersonFile: Text;

30.

Создать файл записей и выдать записи на
экран в обратном порядке.
const
N=10;
FName=’person.rec’;
type
Person=record
Name: String[10];
Gender: Char;
Age:Byte;
end;
var
F: file of Person;
P: Person;
i: LongInt;
begin
Assign(F, FName);
Reset(F);
for i:=1 to N do begin
Write('Введите ФИО, пол и возраст: ');
ReadLn(P.Name, P.Gender, P.Age);
Write(F,P);
end;
Close(F);
Reset(F);
for i:=1 to N dobegin
Seek(F, FileSize(F)-i);
Read(F, P);
WriteLn(P.Name, ' ', P.Gender, ’ ‘. P.Age);
end;
Close(F);
end.

31.

Дан бинарный файл, содержащий записи со следующими полями:
ФИО студента (строка 30 символов),
Курс (целое число)
Средний балл (вещественное число).
Переписать файл, упорядочив записи по курсу, а внутри курса – по фамилии.
typedef struct {
char fio[30]; int kurs; double ball;
} STUDENT;
int Cmp(const void *p1, const void *p2)
{
STUDENT *s1 = (STUDENT *)p1, *s2 = (STUDENT *)p2;
if(s1->kurs != s2->kurs) return s1->kurs - s2->kurs;
return strcmp(s1->fio,s2->fio);
}
int main()
{
FILE *f = fopen(“ input.bin","rb+");
if(!f) {printf("Файл не найден!\n"); return 1;}
long int num = 0;
fseek(f,0,2); num = ftell(f); rewind(f);
if(num%sizeof(STUDENT)) {
printf("Invalid file!\n"); fclose(f); return 1;
}
num/=sizeof(STUDENT);
STUDENT Arr[num];
fread(Arr,sizeof(STUDENT),num,f);
rewind(f);
qsort(Arr,num,sizeof(STUDENT),Cmp);
fwrite(Arr,num,sizeof(STUDENT),f);
fclose(f);
return 0;
}
English     Русский Rules