|
Программирование >> Дополнительные возможности наследования
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];
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |