ТОП 10:

Використання текстових файлів для введення



Текстовий файл – це послідовність ASCII-символів, розділена на стрічки. Кожна попередня стрічка закінчується символом переходу на нову стрічку. Класи файлових потоків оснащений функціями для відкриття і закриття файлів, читання і запису стрічок тексту і виконання багатьох інших дій. В прикладі 4 показано, як відкрити файл, перевірити на помилки і вивести його вміст на дисплей.

 

Приклад 4. Читання і перевірка файлу на помилки


#include <iostream.h>

#include <fstream.h>

 

void main()

{

//відкриття існуючого файлу

ifstream help_file(“\\BC45\\README.TXT” );

 

//перевірка на помилки при відкритті файлу

if(!help_file)

{

cout << “\nCouldn’t open file \\BC45\\README”;

return;

}

 

//відображення вмісту файлу

while(help_file)

{

char buffer[100];

help_file.getline(buffer, sizeof(buffer));

cout << “\n” << buffer;

}

}


 

Виведення текстових файлів

Записувати файли майже так само легко, як і читати. Виникає невелика складність при відкритті файлу в режимі виводу, коли потрібно точно знати, як буде записуватися файл. По замовчуванню існуючий файл (в момент відкриття) врізається до нуля, але таку поведінку можна змінити. В прикладі 5 відкривається файл README.TXT, і його перші чотири стрічки копіюються в новий файл COPY.

 

Приклад 5. Проста програма запису в потік текстового файлу


#include <iostream.h>

#include <fstream.h>

 

void main()

{

//відкриття вже існуючого файлу

ifstream help_file(“\\BC45\\README.TXT”);

 

//відкриття файлу і його урізання до нуля

ofstream copy_file(“COPY”);

 

//перевірка на помилки відкриття

if(!help_file)

{

cout << “\nCouldn’t open file \\BC45\\README”;

return;

}

if(!copy_file)

{

cout << “\nCouldn’t open file COPY”;

return;

}

//копіювання перших чотирьох стрічок файлу README

while(help_file && copy_file)

{

char buffer[80];

help_file.getline(buffer, sizeof(buffer));

copy_file << buffer << “\n”;

if(++line_count == 4)

break;

}

}


Оператор

copy_file << buffer << “\n”;

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

 

char c;

char* cp;

int i;

long l;

float f;

double d;

 

copy_file << c << cp << i << l << f << d;

 

Щоб відкрити файл для запису, не втративши при цьому існуючого в ньому тексту, потрібно використовувати режим додавання в кінець:

 

//відкриття вивідного файлу в режимі додавання в кінець

ofstream copy_file(“COPY”, ios::app);

 

Читання бінарних файлів

Дані в бінарних файлах не мають ніяких роздільників і спеціальних символів. Це також стосується символу ‘\0’. Таким чином, стрічки в бінарному файлі не закінчуються нульовим символом. Фактично самі стрічки в бінарному фалі не мають ніякого смислу. Бінарні файли потрібно обробляти не так, як текстові: в них немає службових символів, їх дані не організовані в стрічки з позначенням кінця кожної стрічки і серед даних можуть бути будь-які восьмибітові значення. Тим не менше, робота з бінарними файлами досить проста. Відкриття і закриття їх здійснюється точно так само, як і текстових файлів, за виключенням того, що в функцію відкриття передається флаг ios::binary. Цілком можливе відкриття текстового файлу в бінарному режимі. Нижче приведено відповідний приклад 6.

 

Приклад 6. Читання текстового файлу в бінарному режимі


#include <iostream.h>

#include <fstream.h>

 

void main()

{

//відкриття існуючого файлу

ifstream help_file(“\\BC45\\README”, ios::binary);

 

//перевірка на помилки відкриття файлу

if(!help_file)

{

cout << “\nCouldn’t open file \\BC45\\README”;

return;

}

 

//відображення файлу readme

while(help_file)

{

char c;

help_file.get(c);

cout << c;

}

}


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

 

char buffer[100];

help_file.read(buffer,sizeof(buffer));

 

Запис у бінарні файли

Для запису бінарних даних в файл існує два основних методи: посимвольний запис і запис блоками. Для першого методу використовується функція put(char), для другого – функція write(char*, int). В прикладі 7 продемонстрована робота обох функцій.

 

Приклад 7. Запис двійкових даних в файл за допомогою двох методів


#include <iostream.h>

#include <fstream.h>

 

class Data {

char name[10];

char surname[20];

int age;

float salary;

 

public:

Data() {age=0;}

int Age() {return age;}

~Data() {}

};

 

void main()

{

//відкриття існуючого файлу

ofstream company_records(“RECORDS.DAT”,

ios::binary);

 

//перевірка на помилки відкриття

if(!company_records)

{

cout << “\nCouldn’t open file RECORDS.DAT”;

return;

}

 

Data employee;

 

int number=0;

while(number < 10 && company_records)

{

company_records.put((char)number++);

company_records.write((char*)&employee,

sizeof(employee));

}

}


Програма записує 10 записів про службовців з об’єкту класу в двійковий файл. Як і завжди, потік слід перевірити на помилки читання або запису. Використання функції write(...) з класами, що мають віртуальні функції або інші складні конструкції, деколи призводить до запису даних, які потім неможливо правильно прочитати за допомогою функції read(...). якщо є сумніви, при записі складних даних краще працювати зі структурами, ніж з класами.

Бінарні файли, в порівнянні з текстовими, складніше використовувати. Це результат неструктурованої природи даних. Коли в файл поміщується бінарний об’єкт, компілятору потрібно точно вказати, яка довжина об’єкту, оскільки в двійковому файлі немає роздільників стрічок, що вказують на довжину. Те ж саме можна сказати і про вилучення даних.

 

Копіювання файлів

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

 

#include <fstream.h>

 

void f()

{

ifstream input(“c:\\t.bat”);

ofstream output(“c:\\u.bat”);

char c;

while(input.get(c))

output.put(c);

}

 

 







Последнее изменение этой страницы: 2016-04-26; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.207.254.88 (0.01 с.)