160.86K
Category: programmingprogramming

Функции работы с файлами языка С. Тема 9

1.

Тема 9.
Функции работы с файлами
языка С
Факультет электротехники и автоматики

2.

Понятие файла
2
Файл - именованный набор данных, хранимый во внешней
памяти. Логически файл можно представить как конечное
количество последовательных байтов, поэтому такие
устройства, как дисплей, клавиатура и принтер можно
рассматривать как частный случай файла.
Данные в программе
Файл данных
int data[2000];
Файл данных
char text[20000];
struct X x[100];
Файл данных

3.

Роль операционной системы
Операционная система управляет размещением файлов на
внешних носителях, а также доступом программ к ним.
Оперативная память
Процесс
Таблица
файловых
дескрипторов
0
1
...
Буфер вводавывода
кэширование
Каждому
открытому
файлу
присваивается уникальное число
(дескриптор).
Операционная
система
Файл данных
3

4.

Бинарный и текстовые файлы
4
Текстовый файл — компьютерный файл, содержащий
текстовые данные. Текстовым файлам противопоставляются
двоичные (бинарные) файлы, в которых содержатся
данные, не рассчитанные на интерпретацию в качестве
текстовых
(например,
файлы,
хранящие
текст
в
закодированном или сжатом виде, или хранящие не текст, а
звук, изображение или иные данные).
Результаты записи переменной int,
содержащей значение 8, в текстовый и бинарный файлы
8
Текстовый файл
Бинарный файл
Текст
Текст
Hex
38
....
Hex
00 00 00 08

5.

Функции открытия и закрытия файла
5
Перед выполнением операций чтения или записи файл
должен быть открыт (связан с файловым дескриптором).
После завершения ввода или вывода файл закрывается.
Пример кода
Доступ
r Чтение.
w Запись. Если файл существует,
FILE* inp; Путь к файлу
он будет перезаписан
a Добавление. Если файл не
//открыть файл
существует, он будет создан
inp = fopen("file.txt","r");
r+ Открытие файла для
if(inp == NULL){
чтения и записи
printf("Ошибка!\n");
w+ Создание нового файла
return;
для чтения и записи
}
a+ Добавление с
возможностью чтения
... // Работа с данными
b Двоичный файл
fclose(inp);//закрыть файл t Текстовый файл
#include <stdio.h>

6.

Структура FILE (stdio.h)
6
После того, как файл открыт, все функции ввода/вывода
работают с файлом не через его имя, а посредством
указателя на структуру типа FILE.
// описание структуры для работы с файлом
typedef struct {
unsigned char *curp; //Текущий активный указатель
unsigned char *buffer;//Буфер передачи данных
int
level; //Уровень зап./опуст. буфера
int
bsize; //Размер буфера
unsigned short istemp;//Индикатор времен.файла
unsigned short flags; //Флаги состояния файла
wchar_t
hold; //Тек.символ (файл без буфера)
char
fd;
//Дескриптор файла
unsigned char token; //
} FILE;
// тип FILE

7.

Позиционирование указателя
7
При работе с файлом все операции чтения и записи
осуществляются в том месте файла, на которое указывает
«указатель потока». Указатель при открытии устанавливается
либо на начало, либо на конец файла и сдвигается
автоматически после каждой операции ввода/вывода.
// Перемещает указатель потока
int fseek(FILE* файл, long смещение, int привязка);
// Возвращает текущую позицию указателя потока
long offset = ftell(FILE* файл);
// Перемещает указатель потока на начало файла
void rewind(FILE* файл);
Указатель
Файл
Привязка
SEEK_SET
(0)
SEEK_CUR
(1)
SEEK_END
(2)

8.

Пример использования указателя
8
// Имеется файл test.dat размером 200 байт
//открыть файл для чтения в бинарном формате
FILE* file = fopen("test.dat", "rb");
fseek(file, 100, SEEK_SET);//100 от начала файла
long ofs1 = ftell(file);
//100
fseek(file, -10, SEEK_CUR);//-10 от текущей поз.
long ofs2 = ftell(file);
//90
fseek(file, 0, SEEK_END);
long ofs3 = ftell(file);
//0 от конца файла
//200 – размер файла
rewind(file);
long ofs4 = ftell(file);
//вернуть в начало файла
//0
fclose(file);

9.

Чтение и запись данных
9
Функции fread и fwrite применяются для чтения и записи
данных в бинарном формате. Они сразу считывают или
записывают блок данных, что удобно при чтении или записи
массивов. Возвращают количество прочитанных или
записанных элементов.
size_t fread(void* ptr, size_t size, size_t n, FILE*);
Адрес буфера
Размер элемента
Число элементов
size_t fwrite(void* ptr, size_t size, size_t n, FILE*);
size_t - Базовый беззнаковый целочисленный тип
языка С/С++. Является типом результата, возвращаемого
оператором sizeof. Размер типа выбирается таким образом,
чтобы в него можно было записать максимальный размер
теоретически возможного массива любого типа.

10.

Пример записи данных
в бинарном формате
Пример кода
//массив данных для записи в файл
double x[] = {100.25, 102.34, 101.73, 110.18};
//определяется размер массива
int n = sizeof(x)/sizeof(double);
//открыть файл для записи в бинарном формате
FILE* out = fopen("Данные.dat", "wb");
//записать в файл n*sizeof(double) байт из x
fwrite(x, sizeof(double), n, out);
fclose(out); //закрыть файл
10

11.

Пример чтения данных
в бинарном формате
11
Пример кода
double x[100]; //массив для данных из файла
//открыть файл для чтения в бинарном формате
FILE* inp = fopen("Данные.dat", "rb");
fseek(inp, 0, SEEK_END);//указатель в конец файла
long size = ftell(inp); //размер файла в байтах
rewind(inp); //указатель в начало файла
//определяет количество чисел double в файле
int n = size/sizeof(double);
//прочесть из файла n*sizeof(double) байт в x
fread(x, sizeof(double), n, inp);
fclose(inp);
//закрыть файл

12.

Чтение и запись по символам
12
Функции fgetc и getc применяются для чтения, а функции
fputc и putc для записи отдельных символов в файлах
текстового формата.
//fgetc читает символ из файла
int fgetc(FILE *stream);
//getc эквивалент fgetc
int getc(FILE *stream);
//fputс записывает символ в файл
//в случае успеха возвращает записанный символ
int fputc(int c, FILE* файл);
//putс эквивалент fputc
int putc(int c, FILE* файл);

13.

Пример посимвольного копирования
13
Пример кода
//копирование одного текстового файла в другой
//открыть файл для чтения в текстовом формате
FILE* file_input = fopen("Текст.txt", "r");
//открыть файл для записи в текстовом формате
FILE* file_output = fopen("Copy.txt", "w");
//цикл читает файл пока не дойдет до конца
char ch;
//EOF – признак конца файла
while((ch = fgetc(file_input))!= EOF)
fputc(ch, file_output);
fclose(file_input); //закрыть файл для чтения
fclose(file_output); //закрыть файл для записи

14.

Чтение и запись по строкам
14
Функции fgets и fputs применяются для чтения и записи
текстовых строк в файлах текстового формата.
//fgets читает size-1 символов из файла и
//помещает их в строку buf; прекращает чтение,
//если встретит символ новой строки;
//возвращает указатель на прочитанную строку
char* fgets(char *buf, int size, FILE* файл);
//fputs копирует строку, заканчивающуюся нулем,
//в файл; в случае успеха возвращает
//неотрицательный символ
int fputs(char *buf, FILE* файл);

15.

Пример записи в текстовый файл
Пример кода
//открыть файл для записи в текстовом формате
FILE* out = fopen("Текст.txt", "w");
fputs("Строка 1", out);
fputs("Строка 2", out);
fputs("Строка 3", out);
fclose(out);
//записать строку
//записать строку
//записать строку
//закрыть файл
Файл с результатом
Строка 1
Строка 2
Строка 3
15

16.

Пример чтения из текстового файла
16
Пример кода
//программа читает текстовый файл и выводит его
//содержимое на экран
char buf[80];//массив для прочитанных данных
//открыть файл для чтения в текстовом формате
FILE* inp = fopen("Текст.txt", "r");
//проверяет наличие индикатора конца файла
while(!feof(inp))
{
//читает строку, но не более 79 символов
fgets(buf, sizeof(buf), inp);
puts(buf);//вывод строки на консоль (экран)
}
fclose(inp);
//закрыть файл

17.

Форматное чтение и запись
17
Функции fscanf и fprintf применяются для чтения и записи
неоднородных данных (числовых и символьных) в файлах
текстового формата. Формат работы с ними соответствует
функциям scanf и printf для стандартного потока
(клавиатура/дисплей). Отличием является первый аргумент
– указатель на структуру FILE для открытого файла.
int fscanf(FILE* файл, char *format, ...);
int fprintf(FILE* файл, char *format, ...);

18.

Пример форматного ввода и вывода
нескольких полей
18
Пример кода
//открыть файл для записи в текстовом формате
FILE* out = fopen("Data.txt", "w");
int day
= 8;
int month = 5;
int year = 2010;
Файл с результатом
Дата: 08.05.2010
fprintf(out, "Дата: %02d.%02d.%d", day, month, year);
fclose(out);
//открыть файл для чтения в текстовом формате
FILE* inp = fopen("Data.txt", "r");
fscanf(inp, "Дата: %d.%d.%d", &day, &month, &year);

19.

Синхронизация буфера и файла
19
Функция fflush применяется для синхронизации буферов
операционной системы и файлов (гарантирует что данные
записаны в файл). При закрытии файла синхронизация
выполняется автоматически.
Пример кода
//открыть файл на запись
FILE* out = fopen("Текст.txt", "w");
fputs("ABC", out); //записать строку
if(!fflush(out)) //синхрон. и проверка результата
printf("Синхронизация прошла успешно");
Буфер
ввода-вывода
ABC
Файл
English     Русский Rules