Обмін блоками даних Зчитати з потоку блок даних заданого розміру можна за допомогою функції size t fread (void *buf, size t size, size t n, FILE *fp);

Презентация:



Advertisements
Похожие презентации
Обмін блоками даних Зчитати з потоку блок даних заданого розміру можна за допомогою функції size t fread (void *buf, size t size, size t n, FILE *fp);
Advertisements

Обмін даними з файлами У компілятор мови С не включено спецзасобів для введення/виведення даних, тому обмін даними реалізовано через бібліотечні функції.
Вказівники Вказівник (або покажчик) – особливий тип даних, значенням якого є адреса певного байта оперативної памяті. Значення покажчика - це беззнакове.
Функції потокового введення/виведення даних Виділяють чотири групи функцій високорівневого обміну відповідно до формату даних, що передаються за одну операцію:
Функції з неоголошеними параметрами Інколи у функції потрібно передати деяке число фіксованих параметрів та невизначене число додаткових. В цьому випадку.
Текстові файли Приклади використання. Текстові файли призначені для зберігання символів Для опису текстової файлової змінної використовується тип Text.
Опрацювання структур у функціях Оскільки мова С інтерпретує структури як звичайні змінні, а не вказівники, можна передавати значення структури у функцію.
Класи пам'яті даних. Клас пам'яті, час існування та видимість об'єкта Кожен обєкт програми (змінна, функція,...) має свій тип і клас памяті. Тип визначає.
ПРОФІЛЬНА ІНФОРМАТИКА 10 КЛАС Масиви. Створення консольних проектів у C#
Консольне введення даних За призначенням клавіші клавіатури можна поділити на групи: – символьні; – клавіші керування: Home, End, …, Delete та чотири стрілки;
Цикли в мові С++ Цикл - це процес виконання певного набору команд деяку кількість разів.
Работа с файлами FILE НГТУ ИРИТ кафедра ИСУ Ольга Пронина.
Вказівники, масиви. Структури Проф. Куссуль Н.М..
Програмування на мові Паскаль Тема Цикли. Цикли Цикл – це багатократне виконання однакової послідовності дій. цикл з відомою кількістю кроків цикл з невідомою.
Обробка символьних рядків в мові С++. План 1.Загальні відомості про рядковий тип даних. 2.Рядок як параметр функції.
Мета уроку : повторити вивчений матеріал по темі «Функція»; вивчити поняття області визначення та області значень функції;навчитися шукати область визначення.
ФУНКЦІЯ. ОБЛАСТЬ ВИЗНАЧЕННЯ ТА ОБЛАСТЬ ЗНАЧЕНЬ ФУНКЦІЇ.
Типи даних мови Visual Basic та їх опис. Опис величин Величина - це об'єкт, який має стале або змінне значення. Основні характеристики величин: ім'я,
Maque.org.ua Adobe ActionScript 3.0 підтримує: Булев (Boolean) Ціле число (int) Неініційована змінна (Null) Число (Number) Рядок або стрічка (String)
Функція Функція – залежність змінної у від змінної х, якщо кожному значенню змінної х відповідає єдине значення змінної у.
Транксрипт:

Обмін блоками даних Зчитати з потоку блок даних заданого розміру можна за допомогою функції size_t fread (void *buf, size_t size, size_t n, FILE *fp); що заносить у буфер n обєктів розміром size. Тип size_t typedef. Borland C int. оголошено в через декларацію typedef. У Borland C він збігається з типом int. Функція повертає кількість реально зчитаних обєктів. Розглянемо приклад визначеня середньоарифметичного значення дійсних чисел, бінарні коди яких зберігаються у файлі. Дані зчитуються в буфер блоками по N чисел. Робота завершується коли розмір зчитаного блоку менший за N, що сигналізує про досягнення кінця файла.

#include #include #define fname "sum.xz" #define N 100 void main() void main() { int a[N], n, i; int a[N], n, i; float s=0, k=0; float s=0, k=0; FILE *f; FILE *f; f =fopen ( fname, "rb"); f =fopen ( fname, "rb");

do { { n=fread (a, sizeof(int), N, f); n=fread (a, sizeof(int), N, f); for (i=0; i<n; i++) for (i=0; i<n; i++) s+=a[i]; s+=a[i]; k+=n; k+=n; } } while (n==N); while (n==N); printf ("sr=%4.2f", s/k); printf ("sr=%4.2f", s/k); fclose(f); fclose(f); }

Запис блоку даних у потік виконує функція size_t fwrite (void *buf, size_t size, size_t n, FILE *fp); Параметри такі ж, як і в функції fread(). Borland C Бібліотека Borland C додатково включає функції int getw (FILE *fp); int putw (int numb, FILE *fp); Функції повертають значення зчитаного або записаного в бінарний файл двобайтового двійкового коду цілого числа. Приклад: знаходження номера заданого числа в даному бінарному файлі

#include #include long Find(FILE *f, int n) { long k=1,N; long k=1,N; do { if (N=getw(f)==n) return k; if (N=getw(f)==n) return k; k++; k++; } while (N!=EOF); } while (N!=EOF); return 0; return 0;} void main() { FILE *f=fopen(prog.xz,rb); FILE *f=fopen(prog.xz,rb); printf(%d,Find(f,5)); printf(%d,Find(f,5)); fclose(f); fclose(f);}

Бінарні файли мають переваги, порівняно з текстовими при зберіганні числових даних. Операції читання і запису з такими файлами виконуються швидше, так як відсутня необхідність форматування (переведення в текстове представлення та навпаки). Двійкові файли зазвичай мають менший розмір, ніж аналогічні текстові файли. В двійкових файлах можна переміщуватися в будь-яку позицію і читати або записувати дані в довільній послідовності, в той час, як в текстових файлах практично завжди виконується послідовна обробка інформації. Робота з бінарними файлами

#include #include struct mystruct { int i; char ch; }; int main(void) { FILE *stream; struct mystruct s; if ((stream = fopen("test.dan", "wb")) == NULL) { fprintf(stderr, "Неможливо відкрити файл\n"); return 1; } s.i = 0; s.ch = 'A'; fwrite(&s, sizeof(s), 1, stream); fclose(stream); return 0; }

Для організації читання даних з файлу в довільному порядку використовується "покажчик файла" (курсор), який визначає поточну позицію у файлі. При читанні даних курсор автоматично зміщується на число прочитаних байтів. Отримати поточну позицію курсору файла можна за допомогою функції ftell() long ftell (FILE *stream); Встановлюється поточна позиція курсору у файлі за допомогою функції fseek(): int fseek (FILE *stream, long offset, int whence); Ця функція задає зміщення на число байтів offset від точки відліку, яка визначається параметром whence. Цей параметр може приймати значення 0, 1, 2.

КонстантаwhenceТочка відліку SEEK_SET0Початок файлу SEEK_CUR1Поточна позиція SEEK_END2Кінець файлу Можливі значення параметра whence функції fseek Якщо задане значення whence=1, то offset може приймати як додатне, так і від'ємне значення, тобто зсув вперед або назад. Функція rewind() переміщує курсор на початок файлу void rewind (FILE *stream); Те ж саме можна зробити за допомогою fseek() fseek (stream, 0L, SEEK_SET); Встановлення покажчика перед 10-м елементом від кінця файла: fseek (f, -10*sizeof(double), SEEK_END); Встановлення покажчика перед 10-м елементом від кінця файла: fseek (f, -10*sizeof(double), SEEK_END);

Приклад визначення розміру файлу #include long filesize (FILE *stream); int main (void) { FILE *stream; stream = fopen("test.dan ", "wb+"); printf("Розмір файла test.dan рівний %ld байт\n", filesize(stream)); fclose(stream); return 0; }

long filesize (FILE *stream) { long curpos, length; curpos = ftell (stream); /*збереження поточної позиції файла*/ fseek (stream, 0L, SEEK_END); /*перехід у кінець*/ length = ftell (stream); /*розмір відповідає зміщенню*/ fseek (stream, curpos, SEEK_SET); /*повернення покажчика на попередню позицію*/ return length; }

Приклад: необхідно знайти добуток матриці а[n][m] на вектор b[m]. В результаті отримаємо вектор с[n]. Значення елементів матриці та вектора вводимо з файлу ish.dan. Результати передаємо на екран та в файл rez.dan. #include #define N 2 #define M 4

void main() { float a[N][M], b[M], c[N]; int i, j; FILE *p1, *p2; p1=fopen("ish.dan","r"); if(p1==0) { puts("Файл ish.dan не открылся"); exit(1); } p2=fopen("rez.dan", "w"); for(i=0; i<N; i++) for (j=0; j<M; j++) fscanf(p1, "%f",&a[i][j]);

for (j=0; j<M; j++) fscanf(p1, "%f",&b[j]); for(i=0; i<N; i++) { c[i]=0; for (j=0; j<M; j++) c[i]+=a[i][j]*b[j]; fprintf(p2, "c[%i]=%f\n", i, c[i]); printf("c[%i]=%f\n", i, c[i]); } fclose(p1); fclose(p2); }