Рекомендуется:
Не рекомендуется:
Двоичные и тектовые файлы
Некоторые операционные системы, например 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 GetWeightconst { return itsWeight; }
10: void SetWeight(int weight) { itsWeight = weight; }
11:
12: long GetDaysAliveconst { 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, замещая собой текущие значения объекта.
Установка параметров ввода-вывода с помощью коммандной строки
Многие операционные системы, такие как DOS и UNIX, позволяют пользователю выполнять установки некоторых параметров при запуске программы. Эти установки называются опциями командной строки и, как правило, отделяются друг от друга пробелами, например:
SomeProgram Param1 Param2 Param3