Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Либерти Джесс. Освой самостоятельно С++ за 21 день. - royallib.ru.rtf
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2.55 Mб
Скачать

Двоичные и тектовые файлы

Некоторые операционные системы, например DOS, различают текстовые и двоичные файлы. В первых все данные хранятся в виде текста (в кодах ASCII). Числовые значения, например 54321, хранятся в виде строки ('5','4','3','2','1'). Возможно это не совсем удобно, однако упрощает считывание информации многими простыми программами для DOS.

Чтобы помочь файловой системе отличить текстовый формат файла от двоичного, язык программирования C++ предоставляет флаг ios::binary. Во многих системах этот флаг игнорируется, поскольку все данные хранятся в двоичном формате. А в некоторых закрытых системах этот флаг вообще запрещен и не поддается компиляции!

В двоичных файлах могут храниться не только числа и строки, но и целые информационные структуры. Весь блок данных можно вывести сразу, используя метод write() объекта fstream.

Записав данные с помощью write(), можно возвратить эти данные обратно с помощью метода read(). В качестве параметра эти функции-члены ожидают получить указатель на символ, поэтому перед использованием функции необходимо привести адрес класса к указателю на строку символов.

Второй аргумент этих функций задает количество записываемых символов. Это значение можно определить с помощью функции sizeof(). Запомните, что записываются данные, а не методы. Соответственно и считываются только данные. В листинге 16.18 показано, как записать содержимое класса в файл.

Листинг 16.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, замещая собой текущие значения объекта.