ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 4 Работа с бинарными файлами (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
Бинарные файлы 2 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Бинарные файлы (binary file) содержат символы, не отображаемые текстовыми редакторами. Файлы, которые состоят только из символов, допустимых в текстовых редакторах, называются текстовыми (plain text). Бинарные файлы позволяют хранить объекты программы (переменные, массивы, структуры) в том формате, в котором они хранятся в оперативной памяти. Хранение данных в формате оперативной памяти имеет следующие преимущества: 1. Компактное размещение (меньший объем памяти). 2. Жестко определенный размер объекта в файле. Недостатком является невозможность чтения данных с помощью текстового редактора.
Хранение целого числа 3 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Необходимо обеспечить хранение числа Текстовый файл: '1' = 0x31 '0' = 0x30 Двоичный файл: =
Хранение целого числа (текстовый файл) 4 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Необходимо обеспечить хранение числа
Хранение целого числа (бинарный файл – F4) 5 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Необходимо обеспечить хранение числа
Хранение целого числа (бинарный файл – F3) 6 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Необходимо обеспечить хранение числа = = = = = =
Хранение целого числа (размеры файлов) 7 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Необходимо обеспечить хранение числа binary_file – 4 байта text_file – 8 байт binary_file – 4 байта text_file – 8 байт
Хранение целого числа (программа create_binfile.c) 8 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Необходимо обеспечить хранение числа #include int main() { int i = ; FILE *fp = fopen("binary_file","w"); fwrite((void*)&i,sizeof(i), 1, fp); fclose(fp); return 0; }
Размеры объектов (оператор sizeof) 9 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Для организации хранения данных в бинарных файлах необходима информация о размерах хранимых программных объектов. Для определения размера программного объекта, предназначенного для хранения данных (переменная, массив, структура). В языке Си для определения размера простых программных объектов существует оператор sizeof.
Определение размера базового типа данного 10 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main(){ printf("Sizes by type:\n" "size of int = %d\n" "size of float = %d\n" "size of char = %d\n", sizeof(int), sizeof(float), sizeof(char) ); return 0; }
Определение размера переменной 11 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main(){ int i; float f; char c; printf("Sizes by type:\n" "size of i = %d\n" "size of f = %d\n" "size of c = %d\n", sizeof(i), sizeof(f), sizeof(c) ); return 0; }
Определение размера статического массива 12 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main(){ int i[10]; float f[] = {1.1, 2.5, 6.7, 9, 10}; printf("Sizes by type:\n" "size of i = %d\n" "size of f = %d\n", sizeof(i), sizeof(f)); return 0; } $./array_sizes Sizes by type: size of i = 40 size of f = 20
Определение количества элементов в статическом массиве 13 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main(){ float f[] = {1.1, 2.5, 6.7, 9, 10}; printf("f has %d elements\n", sizeof(f)/sizeof(int) ); return 0; } $./array_elem_num f has 5 elements
Размер строки 14 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main(){ char str[] = "this is a test string"; printf("Size of str = %d, strlen = %d\n", sizeof(str), strlen(str)); return 0; } $./string_size Size of str = 22, strlen = 21
Размер динамического массива 15 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main(){ int *ptr = malloc(100); printf("Size of ptr = %d\n", sizeof(ptr) ); return 0; } $./dynamic_array_size Size of ptr = 4 Оператор sizeof не позволяет определить размер динамически выделенной памяти.
Размер структуры 16 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include struct my{ int i; float age; }; int main(){ struct my var; printf("Size of struct by name = %d\n" "Size of struct by name = %d\n", sizeof(struct my), sizeof(var) ); return 0; } $./struct_size Size of struct by name = 8
Размер структуры (2) 17 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include struct my{ int i; float f; }; int i float f struct my
Размер структуры (выравнивание ячеек памяти) 18 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» struct t1{ int i; short s; short s1; } a; s_a = sizeof(a); struct t1{ short s; int i; short s1; } b; s_b = sizeof(b); iss1 is
Функции работы с файлом 19 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» size_t fread(void * buf, size_t size, size_t count, FILE * fp); size_t fwrite(const void * buf, size_t size, size_t count, FILE * fp); buf – Область памяти, из которой (в которую) осуществляется запись (чтение) данных. Область рассматривается как массив однотипных элементов. size – размер одного элемента массива buf. count – количество элементов в массиве buf. fp – указатель на структуру типа FILE, который используется для определения с каким оз открытых программой файлов производится указанное действие. Возвращается количество прочитанных (записанных) элементов.
Запись переменных в бинарные файлы 20 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int i = ; float j = 1.0; FILE *fp = fopen("binary_file","w"); // Запись целочисленной переменной fwrite((void*)&i,sizeof(i), 1, fp); // Запись вещественной переменной fwrite((void*)&f,sizeof(f), 1, fp); fclose(fp); return 0; }
Чтение переменных в бинарные файлы 21 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int i; float j; FILE *fp = fopen("binary_file","w"); // Чтение целочисленной переменной fread((void*)&i,sizeof(i), 1, fp); // Чтение вещественной переменной fread((void*)&f,sizeof(f), 1, fp); printf("i=%d, f = %f\n",i,f); fclose(fp); return 0; }
Запись статического массива 22 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int mas[] = {1, 2, 3, 4, 5, 6 }; int s = sizeof(mas)/sizeof(int); FILE *fp = fopen("array_file","w"); // Запись количества элементов fwrite((void*)&s, sizeof(s), 1, fp); // Запись содержимого массива fwrite((void*)&mas, sizeof(mas), s, fp); fclose(fp); return 0; }
Чтение статического массива 23 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int mas[20]; int s; FILE *fp = fopen("array_file","w"); // Запись количества элементов fread((void*)&s, sizeof(s), 1, fp); // Запись содержимого массива fread((void*)&mas, sizeof(mas), s, fp); fclose(fp); return 0; }
Запись статического массива структур 24 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include struct my { char name[256]; int age; }; int main() { struct my mas[] = { {"Jack", 25},... }; int s = sizeof(mas)/sizeof(struct my); FILE *fp = fopen("sarray_file","w"); // Запись количества элементов fwrite((void*)&s, sizeof(s), 1, fp); // Запись содержимого массива fwrite((void*)&mas, sizeof(*mas), s, fp); fclose(fp); return 0; }
Запись статического массива структур 25 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include struct my { char name[256]; int age; }; int main() { struct my mas1[20]; int s; FILE *fp = fopen("sarray_file","w"); // Запись количества элементов fread((void*)&s, sizeof(s), 1, fp); // Запись содержимого массива fread((void*)&mas, sizeof(*mas), s, fp); fclose(fp); return 0; }
Сериализация указателей 26 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Сохранение значений указателей в бинарном файле не имеет смысла, так как в общем случае адреса могут изменяться при каждом запуске программы!
Литература 27 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» 1.Подбельский В.В, Фомин С.С. Программирование на языке Си: Учеб. пособие. - 2-е доп. изд. - М.: Финансы и статистика, с. 2.Керниган Б., Ритчи Д., Фьюер А. Язык программирования Си. Задачи по языку Си: Пер. с англ. - М.: Финанасы и статистика, Вирт Н. Алгоритмы и структуры данных: Пер. с англ. - М.: Мир, с., ил.