Программирование >>  Дополнительные возможности наследования 

1 ... 169 170 171 [ 172 ] 173 174 175 ... 265


ios: :trunc - устанавливается по умолчанию; полностью удаляет (отбрасывает) текущее содержимое файла;

ios: :nocreate - если файл не существует, операция открытия не выполняется;

ios: :noreplace - если файл уже существует, операция открытия не выполняется.

Имена констант являются аббревиатурами выполняемых действий: арр - apend (добавить), ate - at end (в конец), trunc - truncate (отбросить) и т.п.

Листинг 16.17 является модификацией листинга 16.16 с установкой опции добавления данных в файл при его повторном открытии.

Аистпиг 1G.17. ДаОавдЕнис даипых в квввц фавда

ftinclude <fstream.h>

int main() возвращает 1 в случае ошибки {

char fileName[80]; char buffer[255];

cout Please re-enter the file name: ; cin fileName;

ifstream fin(flleName);

if (fin) файл уже существует

cout Current file contents:\ n ; char ch;

while (fin.get(ch)) cout ch;

cout \ n***End of file contents. **\ n ;

>

fin.close();

cout \ nOpening fileName in append mode..,\ n ;

ofstream fout(fileName,ios::app);

if (!fout)

cout Unable to open << fileName for appending.\ n ; return(l);

>

cout \ nEnter text for the file: ; cin.ignore(l,\ n); cin.get line(buffer,255); tout buffer \ n ; fout.closeO;

fin.open(fileName); переопределение существующего объекта fin!

if (!fin)

cout Unable to open fileName for reading.\ n ; return(l);



40 41 42 43 44 45 46 47

cout \ nHeres the contents of the file:\ n char ch;

while (fin,get(ch)) cout ch;

cout \ n...Enc! of file contents. \ n ; fin.close(); return 0;

Please re-enter the file name: testi Current file contents: This line written directly to the file.., This text is written to the file!

. ♦End of file contents.*** Opening testi in append mode...

Enter text for the file: More text for the file!

Heres 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.***

Пользователю вновь предлагается ввести имя файла, после чего в строке 9 создается объект файлового потока ввода. В строке 10 проверяется наличие на диске указанного файла и, если он уже существует, его содержимое выводится на экран строками 12-16. Обратите внимание на то, что выражение if(fin) аналогично if(fin.good()).

Файл ввода закрывается и снова открывается, однако теперь в режиме добавления (строка 22). После этого открытия (как, впрочем, после каждого открытия) выполняется проверка правильности открытия файла. В этом случае условие if(! tout) подобно условию if (fout.failO). Пользователю предлагается ввести текст, после чего в строке 33 файл закрывается.

Наконец, как и в листинге 16.16, файл открывается в режиме чтения, но в этом случае не нужно повторно объявлять объект fin. Он просто связывается с тем же именем файла. После проверки правильности открытия файла в строке 36 содержимое файла выводится на экран и он окончательно закрывается.

Рекомендуется

Постоянно проверяйте правильность открытия файла.

Повторно используйте уже существующие объекты ifstream и ofstream.

Закрывайте все объекты fstream по заверщении работы с ними.

Не рекоменууется

Не пытайтесь закрыть или переопределить объекты cin и cout.



Двоичные u текстовые файАЫ

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

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

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

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

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

Анстннг 16.1В. Запись масса в фзАд

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

ffinclude <fstream.h>

class Animal {

public:

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

int GetWeight()const { return itsWeight; }

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

long GetDaysAliveOconst { return itsNumberDaysAlive; } void SetDaysAlive(long days) { itsNumberDaysAlive = days; }

private:

int itsWeight;

long ItsNumberDaysAlive;

> ;

int mainO returns 1 on error {

char fileName[80];



1 ... 169 170 171 [ 172 ] 173 174 175 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика