Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Не открывается файл


Автор: Usya 22.12.2008, 16:01
Есть код
Код

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". Как это исправить?
Заранее благодарен.

Автор: NewDima 22.12.2008, 17:41
может я чего-то не понимаю... но какой-то странный способ проверки
Код

if (!fin)

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

if (!fin.is_open())

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

Автор: Usya 22.12.2008, 18:01
Цитата

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

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

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

"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();

Данные сохраненного файла выводятся только один раз.

Автор: NewDima 22.12.2008, 18:55
да, интересно, че то здесь с самим объектом не лады, если создать его динамически (fin = new ifstream), использовать, убить, пересоздать, использовать, то работает нормально.
очень интересно

Автор: xvr 22.12.2008, 18:58
Между fin.close(); и fin.open(ddd); позови fin.clear();

Автор: Usya 22.12.2008, 20:46
Цитата

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


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

Цитата

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


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

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

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

Автор: Dmi3ev 22.12.2008, 23:26
Цитата

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

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

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

я не предлагал это как вариант, просто сказал, что это работает, значит что-то нужно еще с объектом делать. xvr сказал, что именно.

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

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

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

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

Кстати, для тех, кто наткнется на эту тему вот еще, к примеру, ссылочка
http://home.comcast.net/~shvets/Docs/Lectures/cplusplus/part08.txt
(в конце страницы) с дополнением по поводу good(), приведенным Dmi3ev.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)