![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
И опять какие-то глюки. Я fstream file вынес и сделал полем класса Cmanager и в методе save(). Теперь у меня выкидывается исключение, мол файл не существует. Если я убираю if(!file) { throw "Couldn`t open file" то цикл нормально крутится, файл создается, но размером 0 байт. Если же в save вручную ввести локальную переменную ofstream file2 и везде вместо file там испольлзовать file2, то все работает. Ошибка, вероятно, глупая. Я ее не вижу
И вообще save_as() вызывающий save() у меня сделано нормально, или так не делают?
И как лучше реализовать проверку "Если файл открыт, ты при вызове save() просто сохранить файл, а если нет, то вызвать save_as() для введения пути к файлу"? Проверять в save условие if (!file.is_open()) { save_as(); }. Ну, естественно, из метода open() надо будет выкинуть file.close()". Это сообщение отредактировал(а) Xenon - 16.12.2006, 22:51 |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
Xenon, можно уточнить вопрос? т.е. привести участок кода, где возникает ошибка, и все что может быть с ней связано - создание объекта класса, инициализация членов и т.д.
А то кода много, копаться лень |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Xenon, если честно, не очень понятна логика..
По мне так - сделать массив path динамическим и в кострукторе занулять его. Тогда в методе Save(): Если в массиве path что-то есть, смотрим, есть ли такой файл - если такой файл есть, дописать туда(или переписать, не знаю что тебе нужно) - если нет такого - спрашиваем, заносим в path название и пишем fstream file лучше создавать в методе, это обеспечит закрытие файла при выходе из метода(ИМХО). -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Xenon |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Ну я вроде нормально написал где проблема в каком методе ... Ок, немного поподробнее
Проблема возникают тут, но где она родилась - не знаю.
Как видите у меня в методе save() имеется условие:
Сейчас в независимости от того, какой путь, у меня всегда выкидывается исключение "Couldn`t open path". Если же вышеприведенный участок закомментировать, а в цикл добавить вывод состояния счетчика, то мы увидим, что цикл работает.
Если у меня 3 альбома в album_list, то на экране появятся цифры "0,1,2". Создается файл, но он размером в 0 байт. Если же сделать так:
То все работает ну просто зашибись - и цикл крутится и файл создается. Я поэтому и не понимаю, чего плохого в том, что file у меня торчит в виде поля класса и если это нормально, то где с ним что в коде приключается Rockie, А я так сделал только потому, что мне необходимо считывать пути с пробелами ... cin.getline() же требует char*. Ты предлагаешь объявить переменную char* path, затем в save_as() и open() добавить
Так ? А что ты подрузомеваешь под обнулением?
Ну гарантирует, я не спорю, но просто я решил то, к чему я часто обращаюсь и что часто создаю вынести и сделать общим - сэкономил несколько строчек кода |
||||||||||||
|
|||||||||||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Мне кажется, что если file объявлен как поле класса он может неправильно проинициализироваться. Попробуй объявить его как указатель, а создавать и уничтожать в конструкторе и деструкторе. |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
У меня вот так нормально работает:
Как ты используешь свой класс? Может там где-нибуть ошибка? Насчет path, или используй string, или хотя бы добавь в конструктор path[0] = 0;, а то если случайно вызвать save() перед save_as(), то всё это дело запишется (если повезёт), куда попало. -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Xenon |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Anikmar, сделал, как ты сказал, но теперь еще веселее - исключительной ситуации не происходит, но файл размером 0 байт
Добавлено @ 16:00 nickless, вот так.
Некоторых пунктов меню не выводится, но это я просто пока не успел их закинуть, но из кода видно, чего нажимать надо Компилятор VC++ 2005 А как ты предлагаешь в string считывать поток без пробелов с возможностю корректирования, как в cin? Разве что:
Но это же жуть ... Это сообщение отредактировал(а) Xenon - 17.12.2006, 16:02 |
||||
|
|||||
| nickless |
|
||||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Странно, вроде ничего такого... а ты добавляешь хотябы один альбом? В коде этого нет. Попробуй еще просто добавить альбом и сразу сохранить, как в моём коде.
В string есть такая глобальная функция:
Т.е. примерно так:
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||||
|
|||||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
nickless, о, клево, не знал
А я пробовал просто добавить альбом и сохранить - нифига. Пробовал заимпортить и сохранить - нифига. Добавить или заимпортить из txt и экспортировать в txt - тоже файл размером 0 байт. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
nickless, попробовал сделать как ты (я про main.cpp) - работает ...
|
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Может VC глючит? Попробуй чем-нибудь другим скомпилить, или file.flush() в деструкторе написать.
Проверь еще, какой статус у file.fail(), file.bad() и file.good(). edit Может ты как-то умудряешся выйти из main() не вызвав деструктора? Это сообщение отредактировал(а) nickless - 17.12.2006, 17:39 -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
nickless, а как невызов деструктора вляиет на невозможность считать?
Еще интересен тот факт, что созданный файл размером 0 байт нельзя убить, пока программа работает - говорит занят файл. Еще интересно - нажимаешь p (сохранить файл), мне сразу говорит, что путь неверен. Нажимаешь еще один раз - предлагает ввести. Если импортируешь из txt альбомы, а не просто добавляешь, то при нажатии p все нормально - выкидывается "Enter path to file", но дальше тоже самое - couldn`t open file и файл с 0 байт. Поменя char path[256] на string - никаких эмоций. Это сообщение отредактировал(а) Xenon - 17.12.2006, 18:00 |
|||
|
||||
| nickless |
|
||||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Я просто подумал, может fstream не пишет в файл если деструктор не вызывался, но вообще после close() это не должно мешать...
А если нормально выключить программу, потом сделать рефреш в експлорере и потом еще раз посмотреть на размер файла?
Посмотри что находится в path в первый раз -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||||
|
|||||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
nickless, не-а, 0 байт и хоть ты здохни.
Если просто добавлять альбомы, а затем сохранять, то как и положено - сначало пусто, а потом тот путь, что указан при вводе. При использовании локально созданного file все работает ... Ну пипец ... Крыша, не уезжай
Это сообщение отредактировал(а) Xenon - 17.12.2006, 18:39 |
|||
|
||||
| zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
не знаю, насколько верно я понял проблему, но в вашей программе я увидел две проблемы:
1. когда пользуемся getline() туда иногда лезет мусор, попробуйте так:
2. как вам уже говорили fstream file; у вас член класса, когда прога натыкается на eof() устанавливаются "плохие" биты состояния (или биты плохого состояния
но это так, первое, что под руку попало, а конкретного вопроса я так и не разглядел, простите... PS вы про пошаговое выполнение программы не слышали? |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |