Освой самостоятельно С++ за 21 день.
Шрифт:
24: {
25: cout << "Unable to open " << fileName << " for appending.\n";
26: return(1);
27: }
28:
29: cout << "\nEnter text for the file: ";
30: cin.ignore(1,'\n');
31: cin.getline(buffer,255);
32: fout << buffer << "\n";
33: fout.close;
34:
35: fin.open(fileName); // переопределение существующего объекта fin!
36: if (!fin)
37: {
38: cout << "Unable to open " << fileName << " for reading.\n";
39: return(1);
40: }
41: cout << "\nHere's the contents of the file:\n";
42: char ch;
43: while (fin.get(ch))
44: cout << ch;
45: cout << "\n***End of file contents.***\n";
46: fin.close;
47: return 0;
48: }
Результат:
Please re-enter the file name: test1
Current file contents:
This line written directly to the file...
This text is written to the file!
***End of file contents.***
Opening test1 in append mode...
Enter text for the file: More text for the file!
Here's the contents of the file:
This line written directly to the file...
This text is written to the file!
More text for the file!
***End of file contents.***
Анализ:
Файл ввода закрывается и снова открывается, однако теперь в режиме добавления (строка 22). После этого открытия (как, впрочем, после каждого открытия) выполняется проверка правильности открытия файла. В этом случае условие if(!fout) подобно условию if (fout.fail). Пользователю предлагается ввести текст, после чего в строке 33 файл закрывается.
Наконец, как и в листинге 16.16, файл открывается в режиме чтения, но в этом случае не нужно повторно объявлять объект fin. Он просто связывается с тем же именем файла. После проверки правильности открытия файла в строке 36 содержимое файла выводится на экран и он окончательно закрывается.
Рекомендуется:Постоянно проверяйте правильность открытия файла. Повторно используйте уже существyющиe oбъeкты ifstream и ofstream. Закрывайте все объекты fstream по завершении работы с ними.
Не рекомендуется:Не пытайтесь закрыть или переопределить объекты cin и cout.
Двоичные и тектовые файлы
Некоторые операционные системы, например 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;