Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одновременый ввод/вывод в файл (fstream), ios_base::openmode 
V
    Опции темы
bobik02
Дата 11.7.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: нет
Всего: 14



в книжке Р. Лафоре "Объектно-Ориентированное Программирование В С++" 4-е издание
ст. 561 - 563 (там же есть и пример), говориться что объект класса fstream может быть использован одновременно как входной так и выходной.
Код

...
fstream file;
file.open ("objects.txt", ios::app | ios::in | ios::out |  ios::binary);
...

Но, при таком "раскладе" , работать не хочет т.е. выражение 
Код
!file
 возвращает true.... (ну или метод ios::fail, возвращает false т.е. failbit)

Но если убрать бит режима открытия файла app (тоже самое и с ate, ), тогда нормально. 

Почему так происходит ? 

Это сообщение отредактировал(а) bobik02 - 11.7.2008, 21:57


--------------------
Have a nice day
PM   Вверх
bsa
Дата 11.7.2008, 22:00 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



ate и app помещают указатель позиции файла в его конец, а это значит, что читать уже нечего (EOF), поэтому и устанавливается этот бит. Если тебе нужно писать в конец и читать с начала, то открывай без этих модификаторов и используй seekp для установки позиции записи в конец.
PM   Вверх
bobik02
Дата 11.7.2008, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: нет
Всего: 14



Что ж с этим я как бы понял, спасибо!  smile 

Но например когда я создаю объект класса ofstream, то если такого файла не существует, он создаться "автоматически"(что удобно). А вот когда объект класса fstream, то нет. почему так ?


--------------------
Have a nice day
PM   Вверх
W4FhLF
Дата 12.7.2008, 10:50 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Цитата(bobik02 @  11.7.2008,  22:15 Найти цитируемый пост)
А вот когда объект класса fstream, то нет. почему так ?


Если ты создаёшь объект класса fstream, то предполагается, что ты собираешься читать и писать, а что можно прочесть из несуществующего файла, либо из пустого, только что созданного? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
bobik02
Дата 12.7.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: нет
Всего: 14



Цитата(W4FhLF @  12.7.2008,  10:50 Найти цитируемый пост)
а что можно прочесть из несуществующего файла, либо из пустого, только что созданного?  

а если сначала в файл будет производиться запись, только потом чтение .


--------------------
Have a nice day
PM   Вверх
W4FhLF
Дата 12.7.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



bobik02, а откуда fstream знать, что сначала, а что потом? Приоритет операций одинаковый. Может это можно указать с пом. к-л флага, но я такого не припоминаю. 

Это сообщение отредактировал(а) W4FhLF - 12.7.2008, 18:16


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
AlterMann
Дата 24.12.2008, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Цитата(bobik02 @  11.7.2008,  22:15 Найти цитируемый пост)
Но например когда я создаю объект класса ofstream, то если такого файла не существует, он создаться "автоматически"(что удобно). А вот когда объект класса fstream, то нет. почему так ? 


Б.Страуструп. Язык программирования С++:
Цитата
Класс basic_ofstream объявлен в <fstream>:
template<class Ch, class Tr = char_traits<Ch> >
class basic_ofstream : public basic_ostream<Ch, Tr> {
public:
    basic_ofstream();
    explicit basic_ofstream (const char* p, openmode m=out | trunc);

    //...
};


вот тот самый trunc - обрезает файл до нулевой длины, и создаёт его (файл)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.