Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Довільний доступ у файлах




 

Більшість файлів складаються з фіксованого числа записів. Це дозволяє звернутися до будь-якого запису.

Якщо файл створюється та в нього записуються дані, а потім його необхідно скорегувати, тобто виконати операції введення-виведення, необхідно його відкривати таким чином:

fp.open("nam.txt", ios::in | ios::out);

if(!fp)

. . .

 

У випадку якщо файлу не існує він не буде створюватись та змінна fp буде дорівнювати нулю.

Якщо такі ж дії виконуються з бінарним файлом, тоді

 

fp.open("nam.txt",ios::in|ios::out|ios::binary);

. . .

Використання функції seekg().

Ця функція забезпечує зчитування даних, починаючи з будь-якого місця файлу.

Формат:

fs_obj. seekg(long_num, origin);

long_num – число байтів у файлі, які треба пропустити, тобто зчитування або запис даних виконується з заданої позиції.

Оскільки файли даних мають великий розмір, необхідно оголосити long_num з типом long int.

origin – є значенням, що повідомляє С++, звідки необхідно почати пропускати байти, зазначені в long_num. Ця змінна може приймати одне з трьох значень:

 

Режим Опис
іos::beg іos::cur ios::end Початок файла Поточна позиція курсору Кінець файла

 

Індикатори режиму ios::beg, ios::cur, ios::end визначені в файлі <iostream>

Для того щоб визначити поточну позицію курсору в файлі використовується функція tellg(), яка повертає значення типу long.

Приклад 1.

Файл читається двічі, перший раз для виведення на екран, другий - на принтер.

 

#include <iostream>

#include <fstream>

using namespace std;

 

ifstream in_file;

ofstream scr;

ofstream prn;

 

void main()

{

char in_char;

in_file.open("name.txt", ios::in);

if(!in_file)

{

cout << "\nПомилка відкриття файлу\n";

exit(0);

}

scr.open("CON", ios::out);

while(in_file.get(in_char))

scr << in_char;

scr.close();

 

in_file.clear();

 

in_file.seekg(0L, ios::beg);

prn.open("LPT1", ios::out);

while(in_file.get(in_char))

prn << in_char;

prn.close();

}

 

Після виведення вмісту файлу на екран дисплею ("CON") вказівка переводиться на кінець файлу та виникає біт помилки ios::eofbit, що дорівнює 1. Для того щоб продовжити роботу з файлом потоку, необхідно скинути цей біт. Робиться це за допомогою функції clear(), яка скидує всі біти помилок файлового потоку.

 

Приклад 2.

Замінити літери i та q, що займають у тексті файлу 9 і 17 позиції на букву X.

 

#include <fstream>

using namespace std;

 

fstream fp;

 

void main()

{

char ch;

fp.open("alph.txt", ios::out);

for(ch = 'a'; ch <= 'z'; ch++)

fp << ch;

fp.seekg(8L, ios::beg);

fp << 'X';

fp.seekg(16L, ios::beg);

fp << 'X';

fp.close();

}

 

Вміст файлу alph.txtбуде виглядати наступним чином:

 

abcdefghXjklmnopXrstuvwxyz

 

 

Приклад 3.

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

 

#include <iostream>

#include <fstream>

using namespace std;

 

ifstream fp;

 

void main()

{

int ctr;

char inchar;

fp.open("alph.txt", ios::in);

fp.seekg(-1L, ios::end);

for(ctr = 0; ctr <= 25; ctr++)

{

fp >> inchar;

fp.seekg(-2L, ios::cur);

cout << inchar;

}

fp.close();

}

 

Результат виконання програми:

 

zyxwvutsrXponmlkjXhgfedcba

Використання додаткових функцій роботи з файлами.

read(char* array, int count) – зчитує кількість байтів, визначуваних у count в масив array.

write(char* array, int count) – записує масив із кількістю даних count у файл.

int remove(char* filename) – видаляє файл з ім’ям filename.

Приклади програм роботи з файлами

Приклад 1. Записати масив у файл ot.txt, прочитати його і вивести на екран.

 

#include <iostream>

#include <fstream>

using namespace std;

 

void main()

{

int i;

int mas[10] = {1,20,300,4,50,600,7,80,900,10};

int vix[10];

 

fstream file;

file.open("ot.txt", ios::out|ios::binary);

file.write((char*)mas,sizeof(mas));

file.close();

 

file.open("ot.txt", ios::in|ios::binary);

file.read((char*)vix,sizeof(vix));

file.close();

 

for (i = 0; i < 10; i++)

cout << vix[i] << " ";

}

 

Для запису масиву до файлу використовується функція write, якій треба передати вказівку типу (char*) та кількість байтів, які треба записати у бінарному режимі. Отже, вказівку масиву mas треба привести до типу вказівки (char*), а у якості кількості байтів передати sizeof(mas) (40 байтів). Зчитування відбувається аналогічним чином з використанням функції read.

Приклад 2. Записати масив у файл ot.txt, прочитати елемент масиву з заданим номером і вивести на екран.

 

#include <iostream>

#include <fstream>

using namespace std;

 

void main()

{

int n_el,zn_el;

int mas[10] = {100,200,3,4,5,6,700,8,9,10};

fstream file;

file.open("ot.txt", ios::out|ios::binary);

file.write((char*)mas,sizeof(mas));

file.close();

 

cout << "Введіть номер елемента -> ";

cin >> n_el;

n_el *= sizeof(zn_el);

 

file.open("ot.txt", ios::in|ios::binary);

file.seekg(n_el, ios::beg);

file.read((char*)&zn_el,sizeof(zn_el));

cout <<"\n" << zn_el;

file.close();

}

 

Приклад 3. Записати масив по рядкам у файл ot.txt, прочитати і вивести на екран кожний рядок.

 

#include <iostream>

#include <fstream>

using namespace std;

 

void main()

{

int i;

char *mas[3]={"Сидоров","Петров","Іванов"};

fstream file;

file.open("ot.txt", ios::out);

for (i = 0; i < 3; i++)

file<< mas[i] << "\n";

file.close();

 

char st[100];

file.open("ot.txt", ios::in);

file.seekg(0L, ios::beg);

for (i = 0; i < 3; i++)

{

file.getline(st, 100);

cout << st << "\n";

}

file.close();

}

 


Поделиться:

Дата добавления: 2014-12-30; просмотров: 158; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты