Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 4_кол / Лекції / ООП (16. Робота з потоками).doc
Скачиваний:
23
Добавлен:
30.05.2020
Размер:
240.13 Кб
Скачать

Двійкові і текстові файли

Деякі операційні системи, наприклад DOS, розрізняють текстові і двійкові файли. По-перше всі дані зберігаються у вигляді тексту (у кодах ASCII). Числові значення, наприклад 54321, зберігаються у вигляді рядка ('5','4','3','2','1'). Можливо це не зовсім зручно, проте спрощує прочитування інформації багатьма простими програмами для DOS.

Аби допомогти файловій системі відрізнити текстовий формат файлу від двійкового, мова програмування C++ надає прапор ios::binary. У багатьох системах цей прапор ігнорується, оскільки всі дані зберігаються в двійковому форматі. А в деяких закритих системах цей прапор взагалі заборонений і не піддається компіляції!

У двійкових файлах можуть зберігатися не лише числа і рядки, але і цілі інформаційні структури. Весь блок даних можна вивести відразу, використовуючи метод write() об'єкту fstream.

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

Другий аргумент цих функцій задає кількість записуваних символів. Це значення можна визначити за допомогою функції sizeof(). Записуються дані, а не методи. Відповідно і прочитуються лише дані. У лістингу 18 показано, як записати вміст класу у файл.

Лістинг 18. Запис класу у файл

1: #include <fstream.h>

2:

3: class Animal

4: {

5:    public:

6:       Animal(int weight, long days):itsWeight(weight), itsNumberDaysAlive(days){ }

7:       ~Animal(){ }

8:

9:       int GetWeight()const { return itsWeight; }

10:      void SetWeight(int weight) { itsWeight = weight; }

11:

12:      long GetDaysAlive()const { return itsNumberDaysAlive; }

13:      void SetDaysAlive(long days) { itsNumberDaysAlive = days; }

14:

15:   private:

16:      int itsWeight;

17:      long itsNumberDaysAlive;

18: };

19:

20: int main() // returns 1 on error

21: {

22:    char fileName[80];

23:

24:

25:    cout << "Please enter the file name: ":

26:    cin >> fileName;

27:    ofstream fout(fileName,ios::binary);

28:    if (!fout)

29:    {

30:       cout << "Unable to open " << fileName << " for writing.\n";

31:       return(1);

32:    }

33:

34:    Animal Bear(50,100);

35:    fout.write((char*) &Bear,sizeof Bear);

36:

37:    fout.close();

38:

39:    ifstream fin(fileName,ios::binary);

40:    if (!fin)

41:    {

42:       cout << "Unable to open " << fileName << " for reading.\n";

43:       return(1);

44:    }

45:

46:    Animal BearTwo(1,1);

47:

48:    cout << "BearTwo weight: " << BearTwo.GetWeight() << endl;

49:    cout << "BearTwo days: " << BearTwo.GetDaysAlive() << endl;

50:

51:    fin.read((char*) &BearTwo, sizeof BearTwo);

52:

53:    cout << "BearTwo weight: " << BearTwo.GetWeight() << endl;

54:    cout << "BearTwo days: " << BearTwo.GetDaysAlive() << endl;

55:    fin.close();

56:    return 0;

57: }

Результат:

Please enter the file name: Animals

BearTwo weight: 1

BearTwo days: 1

BearTwo weight: 50

BearTwo days: 100

Аналіз: У рядках 3-18 оголошується клас Animal. У рядках 22-32 створюється файл, який відкривається для виводу в двійковому режимі. У рядку 34 створюється об'єкт Animal із значеннями змінних-членів itsWeight = 50 і itsNumberDaysAlive = 100. У наступному рядку дані об'єкту заносяться у файл.

У рядку 37 файл закривається, після чого повторно відкривається для читання в двійковому режимі в рядку 39. Створюється другий об'єкт Animal, значення обох змінних-членів якого дорівнюють 1. У рядку 51 дані з файлу прочитуються в новий об'єкт Animal, заміщаючи собою поточні значення об'єкту.