| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Не открывается файл |
| Автор: Usya 22.12.2008, 16:01 | ||
Есть код
На выходе получаем "blu-blu-blu". Как это исправить? Заранее благодарен. |
| Автор: NewDima 22.12.2008, 17:41 | ||||
может я чего-то не понимаю... но какой-то странный способ проверки
используй
если нужно проверить, открылось ли |
| Автор: Usya 22.12.2008, 18:01 | ||||||
В Архангельском, если не ошибаюсь, написано аналогично тому, что я привел.
"blu-blu-blu" не появляется, но проблема этим не решается. Запускаем код
Данные сохраненного файла выводятся только один раз. |
| Автор: 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.clear(), а ряд (в том числе создаваемый программно) - не хочет открываться повторно. |
| Автор: xvr 22.12.2008, 21:26 |
| Все очень просто - если поток вошел в состояние ошибки (EOF в частности), то operator ! будет возвращать false. Метод close не очищает состояние ошибок для потока, поэтому после close() open() поток все равно находится в состоянии ошибки |
| Автор: Dmi3ev 22.12.2008, 23:26 | ||
добавлю, что 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 | ||
я не предлагал это как вариант, просто сказал, что это работает, значит что-то нужно еще с объектом делать. xvr сказал, что именно. |
| Автор: Usya 23.12.2008, 16:24 | ||
| Всем спасибо! Хотел вчера ответить, да попал на перенос форума NewDima
Любая идея, позволяющая что-то решить, - это уже вариант. А почему бы и нет. Бывает, когда работаешь особенно с чужими модулями, не всегда есть возможность и время решить проблему "в лоб", но бывают варианты - как их можно обойти. И только они позволяют быстро накатать рабочий код xvr +1 За решение проблемы. Кстати, для тех, кто наткнется на эту тему вот еще, к примеру, ссылочка http://home.comcast.net/~shvets/Docs/Lectures/cplusplus/part08.txt (в конце страницы) с дополнением по поводу good(), приведенным Dmi3ev. |