Файлова система. Файли прямого доступу
1. Файли прямого доступу
Файл послідовного доступу – це один із способів організації записів у файлі.
Доступ до окремого запису в такому файлі може бути лише послідовним – записуються або зчитуються дані першого запису, потім другого і т.д.
Для пошуку конкретного запису використовується ключове поле. Значення такого поля повинно бути унікальним. Програма забезпечує послідовне зчитування записів і перевірку значення ключового поля. Якщо це значення збігається з тим, що розшукується, – запис знайдений.
Записи файла послідовного доступу можуть мати різну довжину.
Файл довільного доступу – ще один спосіб організації записів у файлі.
Записи файла довільного доступу повинні мати однакову фіксовану довжину. Це дає змогу організувати доступ до конкретного запису безпосередньо, без зчитування інших записів за причини того, що можна обчислити точне положення запису відносно початку файла.
У файл довільного доступу можна вставляти нові дані.
Раніше збережені дані можна редагувати або знищувати без перезаписування усього файла.
Для запису у файл довільного доступу використовується функція fwrite, яка, на відміну від функції fprintf, надає можливість визначити кількість байтів, які повинні бути записані у файл.
Дані записуються, починаючи з того місця у файлі, яке позначено покажчиком позиції файла.
Відразу після відкриття файла покажчик позиції встановлений на перший запис або на кінець файла, якщо у файлі відсутні записи.
Функція fwrite пересилає у файл вказану кількість байтів починаючи із вказаної адреси пам'яті. Її прототип такий:
size_t fwrite(const void *ptr, size_t size, size_t n, FILE*stream);.
Тип size_t визначається як
typedef unsigned size_t;.
Аргумент ptr - це покажчик на будь-який об'єкт; дані записуються, починаючи з адреси, що збережена у покажчику ptr.
Аргумент size – довжина кожного елемента даних.
Аргумент n – кількість елементів даних, які додаються у файл.
Аргумент stream – покажчик на структуру FILE, яка специфікує необхідний файл.
Функція повертає:
■ при успішному завершенні – кількість доданих у файл елементів;
■ у разі помилки – 0.
Загальна кількість байтів, які додаються у файл, дорівнює значенню виразу size×n. Як правило, n=1.
Приклад.#include <stdio.h>
#include <conio.h>
struct DataXY
{
int Npp;
float X;
float Y;
};
main (void)
{
int i=0;
struct DataXY expertData;
FILE *fileXY;
if (( fileXY = fopen("fileXY.txt","wt")) == NULL)
printf (“Error!");
else
{
while ( !feof(stdin) )
{
printf("X,Y? ");
scanf("%f%f", &expertData.X, &expertData.Y);
if ( !feof(stdin) )
{
expertData.Npp=++i;
fwrite (&expertData, sizeof(struct DataXY), 1, fileXY);
}
}
fclose (fileXY);
}
return 0;
}
У наведеній програмі створюється новий тип даних – struct DataXY. У програмі використовується змінна expertData, яка має тип struct DataXY.
Функція fwrite записує блок (задану кількість байтів у файл).
У нашій програмі у результаті виконання оператора
fwrite (&expertData, sizeof(struct DataXY), 1, fileXY);
структура expertData розміром sizeof(struct DataXY) буде записана у файл, на який указує покажчик fileXY.
Третій аргумент (1) – це кількість блоків по sizeof(struct DataXY) байтів, які треба записати у файл.
Якщо б на місці першого аргументу був записаний покажчик на масив, то третій аргумент міг би вказувати на кількість елементів масиву, яке необхідно записати. В нашому випадку є тільки один об'єкт, який необхідно записати.
Запис одного об'єкта еквівалентний запису одного елемента масиву. Тому в програмі у функції fwrite на місці третього аргументу стоїть 1.
Функція fread читає із файлу вказану кількість байтів і пересилає їх за вказаною адресою пам'яті. Її прототип такий:
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);.
Як бачимо, аргументи ті ж самі, що і у функції fwrite. Але функція fwrite пересилає дані із пам'яті у файл, а функція fread пересилає дані із файлу у пам'ять.
Найчастіше область пам'яті, яка використовується для цих функцій, визначається як деяка структура. Одна структура – це один елемент пам'яті. Розмір структури – довжина елемента пам'яті. І, нарешті, покажчик на цю структуру визначає адресу пам'яті, в яку або із якої пересилаються байти.
Прототип функції такий:
int fseek(FILE *stream, long offset, int whence);
Ця функція переміщує маркер позиції у файлі на нову позицію.
Аргумент stream – покажчик на структуру FILE, яка специфікує необхідний файл.
Аргумент offset – різниця у байтах між значенням аргументу whence та новою позицією у файлі.
І, нарешті, аргумент whence, який визначає позицію у файлі (так звану, стартову позицію), відносно якої відраховується нова позиція. Цей аргумент може приймати одне з трьох значень:
SEEK_SET (або 0) – нова позиція відраховується від початку файлу;
SEEK_CUR (або 1) – нова позиція відраховується від поточного положення маркеру;
SEEK_END (або 2) – нова позиція відраховується від кінця файлу.
Для того, щоб переміщувати покажчик, необхідно знати кількість символів у запису.
Як бачимо, для ефективного використання функції fseek, необхідно мати інформацію стосовно поточного положення маркера позиції у файлі.
Для цього використовують функцію ftell.
Її прототип такий:
long ftell(FILE *stream);.
Функція має один аргумент – stream, який визначає файл.
Функція повертає:
- при успішному завершенні – поточну позицію маркера у файлі;
- у разі помилки – -1
#include <stdio.h>
#include <conio.h>
long filesize(FILE *stream); //прототип функції
int main(void) {
FILE *stream; //покажчик на структуру FILE
stream = fopen("MYFILE.TXT", "w"); //відкриття файла
fprintf(stream, "This is a test"); //запис у файл рядка тексту
//виведення розміру файлу на екран за допомогою функції filesize
printf("size MYFILE.TXT is %ld byte\n", filesize(stream));
fclose(stream);getch();
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;
}
fopen() – відкриває файл
fclose () – закриває файл
fputc() – записує символ в файл
fgetc() – зчитує символ з файлу
fseek() – переходить до вказаного байту в файлі
fprintf(),fwrite() – записує дані в файл
fscanf(), fread() – зчитує дані з файлу
feof() – повертає істину при досягненні кінця файлу
ferror() – повертає істину при виникненні помилки
rewind() – повертає індикатор положення в файлі на початок файлу
fflush() – очищує буфер файлу
Шрифти
Розмір шрифта
Колір тексту
Колір тла
Кернінг шрифтів
Видимість картинок
Інтервал між літерами
Висота рядка
Виділити посилання
Вирівнювання тексту
Ширина абзацу