![]() 1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||||||||||||||||
Файл произвольного доступа03.07.2011, 14:36. Показов 6025. Ответов 34
Метки нет Все метки)
(
Очень прошу помощи так как не могу с ними разобраться который день, видать делаю одну и ту же ошибку но не нахожу. Создаю свой класс и потом когда пытаюсь его записать и считать возникают ошибки.
Ну да наверное проще начать обо всём по порядку чтобы не запутывать. Проблема первая: файл каждый раз после записи 10 объектов моего класса в бинарном режиме при открытии текстовым редактором выглядит по разному, хотя размер его одинаковый, это меня настораживает. Пример: запускаю скомпилированное приложение чтобы оно записало 10 объектов моего класса ClientData созданных конструктором по умолчанию и открываю через текстовый редактор и вижу символы :u.ы-I, закрываю и открываю опять своё приложение и вижу уже символы :ucИќ, за третим разом :uО(фҐ , тоесть первые 2 символа всегда те же, а остальные меняются, так ведь быть не должно? Значит ошибка у меня в классе? Тогда просьба подсказать где именно вроде строки уже не использую и все типы данных не должны меняться ... Сам класс ClientData мой представляет собой класс с 3мя данными (номер, имя, баланс) и set и get методами для них (проверок кое-где нету, но не в них суть). ClientData.h (Заголовочный файл к классу)
0
|
03.07.2011, 14:36 | |
Ответы с готовыми решениями:
34
Файл произвольного доступа Файл произвольного доступа Не могу прочитать файл произвольного доступа с конца |
Модератор
![]() ![]() ![]() ![]() ![]() 12841 / 7590 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
|
|||||||||||||
03.07.2011, 14:54 | |||||||||||||
0
|
![]() 1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||||||||||||
03.07.2011, 15:27 [ТС] | ||||||||||||
![]() Добавлено через 1 минуту ![]() Добавлено через 2 минуты Учёл все правки, по прежнему каждый раз при открытии файла текстовым редактором символы разные после каждого запуска программы ![]() Добавлено через 3 минуты А нет, не поправлю, в любом случае код ClientData.cpp (реализация самого класса) теперь такой:
0
|
Модератор
![]() ![]() ![]() ![]() ![]() 12841 / 7590 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
|
||
03.07.2011, 15:27 | ||
И тем не менее - данные для записи в файл откуда берутся?
0
|
![]() 1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||
03.07.2011, 15:31 [ТС] | ||
ClientData client; - создаю объект класса ClientData, создаю по умолчанию значит номер должен быть равен 0, имя= пустой строке и баланс =0.0. Потом пишу 10 раз его в файл for (int i=0;i<10;i++) file.write(reinterpret_cast<const char*>(&client),sizeof(ClientData)); Можно в main и инициализировать мой объект, но это ничего не меняет (всё равно каждый раз когда запускаю программу после выполнения получаю что та же часть символов изменяется, а ведь они не должны меняться, правильно я понимаю ... или всё же могут ... или нет?).
0
|
Заблокирован
|
||
03.07.2011, 16:48 | ||
В код особливо не втыкал...
но могу предположить, что file.write(reinterpret_cast<const char*>(&client),sizeof(ClientData)); //записывает в файл содержимое некоторого куска памяти. И раз уж данные в файле каждый раз разные, стало быть... в самой памяти каждый раз разное.... А что там вообще в памяти? Таким образом, кусок памяти выденный под этот массив каждый раз может содержать разные наборы ноликов и единичек. Не знаю, как точно работает ваш сеттер. Но если ваш сеттер устанавливает дефолтное "", то в лучшем случае только первый элемент обнуляется (если вообще обнуляется) и последний - нулём-терминатором. А весь остальной мусор как был, так и остаётся. По моему скромному мнению, вы неверно сериализуете данные. Нужно загонять в непрерывный блок памяти значение полей данных, а не толкать в файл тупо кусок памяти целиком, со всевозможным сопутствующим мусором.... /ps проинициализируйте массив чаров явно нулями, тогда мусора не будит. А в файле всегда будит одно и тоже
1
|
![]() 1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|||||||
03.07.2011, 19:46 [ТС] | |||||||
ForEveR, а я такой нехороший так и не прочитал, извините, забылось за выходные )
Хотя что-то не сильно гугл выводит меня на информацию о нём и на сайте cplusplus.com нет статьи о нём ... Изменил вот так свою реализацию класса (менялась только реализация функции setName)
Добавлено через 4 минуты У меня есть ещё main по записи и выводу данных в файл этого класса(я его не постил чтобы не запутывать) так вот после этих исправлений в классе он по прежнему после считывания выводит испорченные данные (портит имя и баланс, номер не портит) так что массив символов имя видать по прежнему всё перекручивает, хотя я вроде уже переписал его так что портить же не должен был он ничего ![]()
0
|
![]() ![]() 2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|||
03.07.2011, 20:28 | |||
![]() Считывание не работает? Файл можно не смотреть даже.
0
|
![]() 1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|||||||
03.07.2011, 20:47 [ТС] | |||||||
![]()
1) Я вызываю 3 раза создание нового клиента (есть менюшка но это ещё + код, не буду запутывать), после его создания я добавил считывание и вывод данных. По работе этого я вижу что всё хорошо и данные после записи считываются нормально. Если пытаешься перезаписать данные то функция отлично видит что они уже есть так что пишет вроде нормально, вроде. 2)Я вызываю функцию для печати данных и что я вижу: поле номер считалось нормально, поле имя пустое(чаще всего), а в поле баланс поселилось что-то непонятное вида 2.53354e-307 которое появляется всегда в нём. Помогите, справиться с этим злосчастным классом, а, очень хочется разобраться с ним ![]() На всякий случай креплю все файлы в zip архиве, может кому так будет удобнее.
0
|
В астрале
![]() ![]() 8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
03.07.2011, 21:57 | |
Gepar, boost::serialization
Не по теме: А вообще это круто - искать инфу про boost на cplusplus.com.
0
|
![]() ![]() 2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
||||||
03.07.2011, 23:00 | ||||||
![]() Решение
В функции newRecord:
![]()
3
|
![]() 1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
04.07.2011, 14:25 [ТС] | |
Тьфу-ты ну ты, вот где собака была зарыта
![]() Кстати ещё такой вопрос относительно этого класса: как переименовывать созданный файл? Ну был 1.dat, а я после того как скопировал с него данные хочу чтобы он стал 123.dat например. Есть ли в с++ для этого функции какие или надо использовать возможности виндовс через system("") ? Добавлено через 1 минуту ForEveR, ну я хочу разобраться с этим методом записи до конца, а потом уже с другими потому и не воспользовался им. Bers, так а где мусор то, а если без мусора то тогда как по вашему должна выглядеть функция по записи имени в символьный массив (это чтобы ещё и при открытии текстовым редактором файла он выглядел всегда одинаково, хотя это уже и не столь важно).
0
|
04.07.2011, 14:25 | |
Помогаю со студенческими работами здесь
20
Создание файла произвольного доступа Создание файла произвольного доступа.
Обработка файлов произвольного доступа
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
|
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
|
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
|
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг.
Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя.
Странные серые краски проникают и. . .
|
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
|
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
|
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
|
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
|
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
|
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
|