Головна

Int fseek (FILE * stream, long offset, int origin).

  1.  Harry did so, staring at the stone basin. The contents had returned to their original, silvery white state, swirling and rippling beneath his gaze.
  2.  The Celts. Their origin and culture. Boadicea.

Функціяпозволяет обробляти файл подібно масиву і безпосередньо досягати будь-якого певного байта у файлі, відкритого функцією fopen (). Функція має три аргументи:

1. покажчик типу FILE, На файл, в якому ведеться пошук.

2. аргумент, який вказує на крок, з яким необхідно пересуватися від початкової точки. Він повинен мати тип long, І знак в залежності від напрямку пошуку.

3. Код, що визначає точку відліку:

0 - Початок файлу, (SEEK_SET)

1 - Поточна позиція (SEEK_CUR)

2 - Кінець файлу. (SEEK_END)

функція fseek () повертає значення типу int. У разі успішного завершення - 0, в разі помилки - значення, відмінне від нуля.

Для визначення поточної позиції файлового покажчика використовується функція:

long ftell (FILE * stream)

Приклад побайтовой чергується друку файлу в прямому і зворотному порядку

main ()

{FILE * fi;

long offset = OL;

if ((fi = fopen ( "proba", "r")) == 0)

{Printf ( "Не можливо відкрити файл");

 return (1);

}

else

{While (fseek (fi, offset ++, 0) == 0)

{Putchar (getc (fi));

 if (fseek (fi, - (offset + 3), 2) == 0)

 putchar (getc (fi));

}

}

fclose (fi);

}

Наша програма друкує перший символ файлу, потім останній, потім другий, потім передостанній. код 2 - Означає, що ми читаємо з кінця файлу. +3 - Ми намагаємося обійти останні символи у файлі, що записуються системою (EOF і 2 символи нового рядка). Перевірити це можна експериментально, т. К. Для кожної системи це поєднання по-різному.

Тепер спробуємо змінити вміст четвертого рядка файлу. Для цього потрібно вважати всі рядки, знайти четверту, замінити її і зберегти зміни. функції fseek () и ftell () використовуватимемо для переміщення покажчика всередині файлу.

#include

#include

main ()

{FILE * fptr;

char StrBuf [80];

char NameCmp [] = "Петров \ n";

long int CurPos;

if ((fptr = fopen ( "stopy.txt", "r + t")) == NULL)

{Printf ( "Помилка відкриття файлу");

return (1); // Вихід з кодом повернення 1

}

while (fgets (StrBuf, 80, fptr)! = NULL)

{CurPos = ftell (fptr);

// При збігу рядків пересунути покажчик на початок рядка

// І записати на це місце новий рядок

 if (stricmp (StrBuf, NameCmp) == 0)

 {Fseek (fptr, (CurPos-strlen (NameCmp) -1), SEEK_SET);

 frintf (fptr, "% s | n", "Петрова");

}

}

fseek (fptr, 0, SEEK_SET) // на початок файлу

// Послідовно прочитати і вивести вміст файлу,

// Поки fgets () не повернеться NULL, що означає кінець файлу

while (fgets (StrBuf, 80, fptr)! = NULL)

puts (StrBuf);

fclose (fptr);

return 0;

}

результат: Іванов

 Кареніна

 Обломов

 Петрова

 Ідор

У файлах з послідовним доступом запис нового рядка проводиться поверх старої рядка. Тому пропала перша буква останнього рядка.

У таких файлах простіше дописувати інформацію в кінець файлу, а ось виправлення інформації в середині файлу пов'язане з рядом труднощів.

У файлах, де одиницею зберігання інформації є запис (структура), доцільно використовувати для читання і запису функції fread () и fwrite ().

функція fwrite () забезпечує виведення даних

int fwrite (void * ptr, unsegned size, int k, FILE * stream);

void * ptr - покажчик змінної будь-якого типу, з якою рахуються записи в файл

unsegned size - довжина запису в байтах

int k - Кількість які розміщені в файл записів розміром size

FILE * stream - ім'я покажчика файлу

Функція повертає число реально записаних елементів, яке дорівнює числу затребуваних елементів. Якщо ж записано менше елементів, ніж затребувано при виклику - стався збій.

Для читання з файлу використовується функція fread ().

int fread (void * ptr, unsegned size, int k, FILE * stream);

void * ptr - покажчик змінної будь-якого типу, в яку читаються записи

unsegned size - довжина запису в байтах

int k - Кількість зчитувальних записів розміром size

FILE * stream - ім'я покажчика файлу

Функція повертає число реально прочитаних елементів.

Номер кожного запису в файлі розраховується на основі розміру записи і поточного стану файлового покажчика. Наприклад, якщо довжина запису дорівнює 24 байтам, а поточна позиція дорівнює 0, то номер запису можна обчислити таким чином:

 Recorg_Number = Position / Record_Size (0/24 = 0)

Обчислити, зберегти і витягти запис за номером можна в наступному прикладі:

#include

#include

#include

#include

struct str_Names {long int RecNo;

char FirstName [20]; };

main ()

{FILE * fptr;

 struct str_Names NameRecord;

char ch;

if ((fptr = fopen ( "Names.bin", "w + b")) == NULL)

{Printf ( "Помилка відкриття файлу");

return (1); // Вихід з кодом повернення 1

}

strcpy (NameRecord.FirstName, "Іванов");

NameRecord.RecNo = (ftell (fptr) / sizeof (struct str_Names));

fwrite (& NameRecord, sizeof (struct str_Names), 1, fptr);

strcpy (NameRecord.FirstName, "Кареніна");

NameRecord.RecNo = (ftell (fptr) / sizeof (struct str_Names));

fwrite (& NameRecord, sizeof (struct str_Names), 1, fptr);

strcpy (NameRecord.FirstName, "Обломов");

NameRecord.RecNo = (ftell (fptr) / sizeof (struct str_Names));

fwrite (& NameRecord, sizeof (struct str_Names), 1, fptr);

strcpy (NameRecord.FirstName, "Петров");

NameRecord.RecNo = (ftell (fptr) / sizeof (struct str_Names));

fwrite (& NameRecord, sizeof (struct str_Names), 1, fptr);

strcpy (NameRecord.FirstName, "Сидоров");

NameRecord.RecNo = (ftell (fptr) / sizeof (struct str_Names));

fwrite (& NameRecord, sizeof (struct str_Names), 1, fptr);

fseek (fptr, 0, SEEK_SET)

// Послідовний перегляд файлу і виведення значень

do

{Printf ( "\ n% s \ n", "Введіть цифру від 0 до 4");

 printf ( "\ n% s \ n", "Натисніть будь-яку іншу клавішу для закінчення");

 ch = getch ();

 if (ch> = '0' && ch <= '4')

 {Fseek (fptr, (ch-48) * sizeof (struct str_Names), SEEK_SET);

fread (& NameRecord.FirstName, sizeof (struct str_Names), 1, fptr);

printf ( "\ n% s% d", "Запис №", NameRecord.RecNo);

 printf ( "\ n% s% s \ n", "Ім'я:", NameRecord.FirstName);

 printf ( "% s | n", NameRecord.FirstName);

}

 else break;

} While (1);

fclose (fptr);

 return 0;

}

результат: Введіть цифру від 0 до 4

Натисніть будь-яку іншу клавішу для закінчення

запис №1

Ім'я: Іванов

Введіть цифру від 0 до 4

Натисніть будь-яку іншу клавішу для закінчення

запис №4

Ім'я: Петров

Введіть цифру від 0 до 4

Натисніть будь-яку іншу клавішу для закінчення

2.2. ПОРЯДОК ВИКОНАННЯ РОБОТИ.

1. Вивчити матеріал даного методичного посібника, залучаючи лекції та додаткову літературу;

2. Розробити схеми алгоритмів і програму для обробки даних відповідно до конкретного варіантом.

2.3. ВАРІАНТИ ЗАВДАНЬ

1. У файлі знаходяться речові числа. Визначити кількість елементів файлу, величина яких менше середнього арифметичного всіх елементів даного файлу.

2. На основі структури створити довільну базу даних. Дані зберігаються в файлі. Програма повинна містити наступні функції:

- Введення нових записів в файл;

- Видалення записів з файлу;

- Пошук записів по будь-якій комбінації ознак у файлі;

- Коригування записів;

- Висновок даних з файлу.

3. Створити файл, що містить відомості про товари, що зберігаються на складі: шифр, найменування, кількість одиниць, вартість одиниці. Написати і протестувати функції:

- Сортування записів в порядку зростання шифру товару;

- Отримання вартості товарів, відібраних за заданому ключу.

2.4. КОНТРОЛЬНІ ПИТАННЯ

1. Що таке бінарний файл?

2. Що таке текстовий файл і його відмінність від бінарного?

3. Які функції використовуються для обміну даними між оперативною пам'яттю і файлом?

4. У чому відмінність між послідовним і довільним доступом до файлу?

5. Яке значення повертає функція fopen ()?

6. Що собою являє тип FILE?


3. Лабораторна робота №3

Мета даної лабораторної роботи полягає в ознайомленні з механізмами об'єктно-орієнтованого програмування: инкапсуляцией, перевантаженням операцій і функцій, спадкуванням.

3.1. МЕТОДИЧНА ЧАСТИНА

С ++ - мова об'єктно-орієнтованого програмування (ООП). В основі ООП лежать три основні концепції: інкапсуляція, поліморфізм і успадкування.

 



 Структура пов'язаного двонаправленого списку |  інкапсуляція

 структури |  Імя_структури. імя_елемента |  Структури і функції |  динамічні структури |  спадкування |  МАНІПУЛЯТОРИ ВВЕДЕННЯ-ВИВЕДЕННЯ |  ФУНКЦІЇ ВСТАВКИ І ВИЛУЧЕННЯ |  ОСНОВИ файлового вводу-виводу |  Неформатіруемий двійковий введення / виведення |  Додаткову інформацію про функції двійкового введення / виведення |

© um.co.ua - учбові матеріали та реферати