КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Довільний доступ у файлах
Більшість файлів складаються з фіксованого числа записів. Це дозволяє звернутися до будь-якого запису. Якщо файл створюється та в нього записуються дані, а потім його необхідно скорегувати, тобто виконати операції введення-виведення, необхідно його відкривати таким чином: 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. Ця змінна може приймати одне з трьох значень:
Індикатори режиму 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(); }
|