Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не открывается файл 
:(
    Опции темы
Usya
Дата 22.12.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть код
Код

ifstream fin;
char c;
ofstream fout;

fout.open(ddd);
fout<<1<<endl;
fout.close();

fin.open(ddd);
if (!fin) {ShowMessage("bla-bla-bla");}
while ((c=fin.get())!=EOF) {};
fin.close();

fin.open(ddd);
if (!fin) {ShowMessage("blu-blu-blu");}
while ((c=fin.get())!=EOF) {};
fin.close();

На выходе получаем "blu-blu-blu". Как это исправить?
Заранее благодарен.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
NewDima
Дата 22.12.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

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



может я чего-то не понимаю... но какой-то странный способ проверки
Код

if (!fin)

используй
Код

if (!fin.is_open())

если нужно проверить, открылось ли
PM ICQ   Вверх
Usya
Дата 22.12.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

может я чего-то не понимаю... но какой-то странный способ проверки

В Архангельском, если не ошибаюсь, написано аналогично тому, что  я привел.
Цитата

если нужно проверить, открылось ли 

"blu-blu-blu" не появляется, но проблема этим не решается.
Запускаем код
Код

ifstream fin;
char c;
ofstream fout;

fout.open(ddd);
fout<<1<<endl;
fout.close();

fin.open(ddd);
if (!fin.is_open()) {ShowMessage("bla-bla-bla");}
while ((c=fin.get())!=EOF) { Memo1->Lines->Add(c); }; //Добавил вывод
fin.close();

fin.open(ddd);
if (!fin.is_open()) {ShowMessage("blu-blu-blu");}
while ((c=fin.get())!=EOF) { Memo1->Lines->Add(c); }; //Добавил вывод
fin.close();

Данные сохраненного файла выводятся только один раз.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
NewDima
Дата 22.12.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

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



да, интересно, че то здесь с самим объектом не лады, если создать его динамически (fin = new ifstream), использовать, убить, пересоздать, использовать, то работает нормально.
очень интересно
PM ICQ   Вверх
xvr
Дата 22.12.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Между fin.close(); и fin.open(ddd); позови fin.clear();

PM MAIL   Вверх
Usya
Дата 22.12.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

если создать его динамически (fin = new ifstream), использовать, убить, пересоздать, использовать, то работает нормально


Но это лишние бревна на пустом месте (как вариант конечно подойдет).
Кстати, есть и более простой способ, правда хуже - новый файл пихать в новый поток, но и это не выход - как минимум, может много быть потоков.

Цитата

Между fin.close(); и fin.open(ddd); позови fin.clear();


Заработало, но почему нельзя обойтись без него?

И все равно не совсем понятно - в первом тестовом примере, чтобы не было дополнительных вопросов по поводу создания файла, я включил  соответствующий код в пример.
Но задача изначальна была такова (я еще не успел разобраться в причине) - ряд файлов на винте открывается и обрабатывается нормально даже и без fin.clear(), а ряд (в том числе создаваемый программно) - не хочет открываться повторно.


Это сообщение отредактировал(а) Usya - 22.12.2008, 20:49
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
xvr
Дата 22.12.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Все очень просто - если поток вошел в состояние ошибки (EOF в частности), то operator ! будет возвращать false. Метод close не очищает состояние ошибок для потока, поэтому после close() open() поток все равно находится в состоянии ошибки

PM MAIL   Вверх
Dmi3ev
Дата 22.12.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

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



Цитата

Все очень просто - если поток вошел в состояние ошибки (EOF в частности)

добавлю, что if(!fin) можно записать, как if(!fin.good()) (для ясности...) 
good() - возвращает true, если bad() fail() eof() все возвращают false, а в данном случае eof() возвращает true, это даже можно проверить, сделав между первым и вторым открытием запись if(fin.eof()) {ShowMessage("blu-blu-blu");}


--------------------

PM MAIL   Вверх
NewDima
Дата 23.12.2008, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

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



Цитата(Usya @ 23.12.2008,  03:46)
Но это лишние бревна на пустом месте (как вариант конечно подойдет).

я не предлагал это как вариант, просто сказал, что это работает, значит что-то нужно еще с объектом делать. xvr сказал, что именно.
PM ICQ   Вверх
Usya
Дата 23.12.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем спасибо!
Хотел вчера ответить, да попал на перенос форума smile
NewDima
Цитата

я не предлагал это как вариант

Любая идея, позволяющая что-то решить, - это уже вариант. А почему бы и нет. Бывает, когда работаешь особенно с чужими модулями, не всегда есть возможность и время решить проблему "в лоб", но бывают варианты - как их можно обойти. И только они позволяют быстро накатать рабочий код smile

xvr
+1
За решение проблемы.

Кстати, для тех, кто наткнется на эту тему вот еще, к примеру, ссылочка
http://home.comcast.net/~shvets/Docs/Lectu...plus/part08.txt
(в конце страницы) с дополнением по поводу good(), приведенным Dmi3ev.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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