|
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||||||||||||||||
Файл произвольного доступа03.07.2011, 14:36. Показов 6297. Ответов 34
Метки нет (Все метки)
Очень прошу помощи так как не могу с ними разобраться который день, видать делаю одну и ту же ошибку но не нахожу. Создаю свой класс и потом когда пытаюсь его записать и считать возникают ошибки.
Ну да наверное проще начать обо всём по порядку чтобы не запутывать. Проблема первая: файл каждый раз после записи 10 объектов моего класса в бинарном режиме при открытии текстовым редактором выглядит по разному, хотя размер его одинаковый, это меня настораживает. Пример: запускаю скомпилированное приложение чтобы оно записало 10 объектов моего класса ClientData созданных конструктором по умолчанию и открываю через текстовый редактор и вижу символы :u.ы-I, закрываю и открываю опять своё приложение и вижу уже символы :ucИќ, за третим разом :uО(фҐ , тоесть первые 2 символа всегда те же, а остальные меняются, так ведь быть не должно? Значит ошибка у меня в классе? Тогда просьба подсказать где именно вроде строки уже не использую и все типы данных не должны меняться ... Сам класс ClientData мой представляет собой класс с 3мя данными (номер, имя, баланс) и set и get методами для них (проверок кое-где нету, но не в них суть). ClientData.h (Заголовочный файл к классу)
0
|
||||||||||||||||
| 03.07.2011, 14:36 | |
|
Ответы с готовыми решениями:
34
Файл произвольного доступа Файл произвольного доступа Не могу прочитать файл произвольного доступа с конца |
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
| 03.07.2011, 14:51 | |
|
конструктор неправильно написан
0
|
|
|
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
| 03.07.2011, 14:53 [ТС] | |
|
pito211,напиши что именно, ато там 3 строчки, вроде всё ок ... хотя может слона я и не замечаю, но вы мне покажите его хоть
0
|
|
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
||||||
| 03.07.2011, 14:54 | ||||||
|
хотя может и правильно, но как то криво. Эта строка
0
|
||||||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
|
|||||||||||||
| 03.07.2011, 14:54 | |||||||||||||
0
|
|||||||||||||
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
| 03.07.2011, 15:10 | |
|
кстати фаил не закрыл
0
|
|
|
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||||||||||||
| 03.07.2011, 15:27 [ТС] | ||||||||||||
Хотя я попробую сделать как Вы написали, может эти преобразования как-то затрагивают мою запись в файл ...Добавлено через 1 минуту ![]() Добавлено через 2 минуты Учёл все правки, по прежнему каждый раз при открытии файла текстовым редактором символы разные после каждого запуска программы Код в первом посте сейчас поправлю с учётом правок.Добавлено через 3 минуты А нет, не поправлю, в любом случае код ClientData.cpp (реализация самого класса) теперь такой:
0
|
||||||||||||
|
Модератор
12843 / 7592 / 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
|
||
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
||
| 03.07.2011, 18:32 | ||
|
0
|
||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 03.07.2011, 19:20 | |
|
А чем вариант с boost::serialization не понравился? Я ведь целиковый вариант в прошлой теме дал.
0
|
|
|
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
|
|||||||
|
Заблокирован
|
|
| 03.07.2011, 21:31 | |
|
Вы сохраняете объект с мусором. Избавьтесь от мусора в массиве чаров, и будит вам щастье. В чом проблема то?
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:
account это int, а не ClientData!
3
|
||||||
|
Заблокирован
|
|
| 03.07.2011, 23:57 | |
|
кстати, да. 50 и 46 строчка.
0
|
|
|
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
| 04.07.2011, 14:25 [ТС] | |
|
Тьфу-ты ну ты, вот где собака была зарыта
Теперь поправил и оно и сохранило и считало нормально данные (мусор отбрасывается при выводе так как о уже после '\0'). Ну что же, теперь осталось дописать остальные функции по работе с файлом. Кстати ещё такой вопрос относительно этого класса: как переименовывать созданный файл? Ну был 1.dat, а я после того как скопировал с него данные хочу чтобы он стал 123.dat например. Есть ли в с++ для этого функции какие или надо использовать возможности виндовс через system("") ? Добавлено через 1 минуту ForEveR, ну я хочу разобраться с этим методом записи до конца, а потом уже с другими потому и не воспользовался им. Bers, так а где мусор то, а если без мусора то тогда как по вашему должна выглядеть функция по записи имени в символьный массив (это чтобы ещё и при открытии текстовым редактором файла он выглядел всегда одинаково, хотя это уже и не столь важно).
0
|
|
| 04.07.2011, 14:25 | |
|
Помогаю со студенческими работами здесь
20
Создание файла произвольного доступа Создание файла произвольного доступа.
Обработка файлов произвольного доступа
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|