![]() |
|
Модераторы: bsa |
![]()
|
|
| catherham |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 7.7.2010 Репутация: нет Всего: нет |
Мне нужно записать структуру в файл.Структура выглядит так:
struct bite { unsigned char zn [256]; string cod[256]; }; Проблема в том, что массив zn[256] записывается полностью, а массив строк нет. Не записываются строки длиной в 16 символов и более. Код функции void writetable() { ofstream table("c:/hr.sh",ios::binary); for( int k=0; k<=255; k++) { table.write(&znb.zn[k], 1); table.write(reinterpret_cast<char*>(&znb.cod[k]), 50); } table.close(); } |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
жесть... работайте либо с массивом указателей на "строки", какие бы они у вас не были. либо откройте для себя сериализацию. и обязательно поищите по слову "структур". ибо эта тема поднималась множество раз. Это сообщение отредактировал(а) boostcoder - 27.4.2011, 20:59 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
разберём: znb.cod - массив, в котором хранятся классы (в нашем случае - string) znb.cod[k] - один из элементов массива, т.е. одна строка &znb.cod[k] - указатель на эту строку, т.е. адрес по которому расположен экземпляр класса string reinterpret_cast<char*>(&znb.cod[k]) - преобразование этого указателя (мы помним, что он указывает на экземпляр класса string) к указателю на char, т.е. адрес остался тот же, но мы перестаём считать, что там лежит экземпляр класса string, и считаем, что там лежит char. Вопрос с чего это решено, что это (указатель на класс и указатель на char) - это одно и то же ? и ещё. в файл, конечно, можно записать сначала один символ из массива unsigned char'ов, затем одну строку, и так далее, но тебе не кажется, что это не совсем логично ? Логичнее записать сначала весь массив unsigned char'ов, а затем все строки из массива строк. Теперь дальше. В одной строке типа string может храниться от 0 до практически сколько угодно символов. Сколько из них ты хочешь записать в файл ? Если все, то как ты узнаешь при чтении, что одна строка уже закончилась и началась вторая ? Пример: 1. Казнить нельзя 2. помиловать в файле будет Казнитьнельзяпомиловать Добавлено через 4 минуты и 46 секунд вот это тож понравилось - эдакая помесь windows с linux. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| catherham |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 7.7.2010 Репутация: нет Всего: нет |
У меня в билдере только так работает.
Не знаю, по моему вполне логично в данном случае. Зачем писать два цикла?.
Тут всё просто string это массив символов, часть массива занята остальные "" т.е. пустые. Я записываю и считываю по 50, в данном случае, байт. Таким образом: "блабла /*здесь пусто.*/" "блабла1 /*здесь пусто.*/" Строки разные, но в итоге считываем 50, 10 из них,например, нас интересует остальное пусто, а вот это пусто может быть 40 или 39, не важно. А вообще я ещё пробовал так table.write(reinterpret_cast<char*>(&znb), sizeof(bite)); Такая же фигня, записывает и считывает нормально, но строки в 16 и более символов пустые. Мне бы пример как сделали бы вы, можно на с, можно на с++ Это сообщение отредактировал(а) catherham - 27.4.2011, 22:21 |
||||||
|
|||||||
| borisbn |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
если ты имеешь в виду, что так не работает "C:\hr.sh" то это не в билдере, а во всём Си++ не работает. Обратный слеш нужно повторять, т.е. строка должна выглядеть так "C:\\hr.sh"
ну... дело твоё. а два цикла писать и не надо. первая запись должна быть такой
а дальше уже цикл ужЕ не верно. string - это класс. его внутренняя организация в общем случае вообще неизвестна. она может быть, например, такая
что будет, если ты возьмёшь адрес экземпляра такого класса ? максимум, что ты имеешь право делать, так это попросить класс string вернуть тебе указатель chars_ptr (string::c_str()), который уже указывает на массив (вернее на начало массива) символов, причём количество символов в этом массиве = длина строки. и никак не больше (с чего бы это больше?) с чего ты это взял ? честно говоря, с этого нужно было начинать - мне нужно то-то, я сделал так-то, не работает, в чём проблема, можно пример как правильно... ладно, с нравоучениями покончили. теперь к делу
как-то так. фух. устал. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||
|
|||||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
[оффтоп]не первый год это знаю, но до сих пор не могу запомнить кто из них прямой, а кто обратный |
|||
|
||||
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
обратный слеш я, например, так запомнил: linux - прямой, windows - обратный ( т.е. не прямой, т.е. кривой а мне понравилось, как в до-диезе сделали unescape: либо классически
либо так
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Еще одна тема - кандидат на прибивание гвоздями в шапке раздела -
И еще -
|
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
xvr, знаешь, таких тем можно наплодить миллион и маленькую тележку. НО ИХ ВСЕ РАВНО НИКТО ЧИТАТЬ НЕ БУДЕТ. Так как для того, чтобы ее прочитать, нужно сначала самому узнать, в чем дело. А это уже 90% работы. Добавлять в FAQ тоже бесполезно - его все равно никто не читает. Идея с похожими темами могла бы спасти, но, судя по всему, туда тоже никто не заглядывает.
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Угу, но я не тему предлагал создать - а повесить это (в раскрытом виде) прямо перед глазами всякого, заходящего в раздел. Остался открытым вопрос - где именно и как это можно повесить Так что это скорее вопрос к админам |
|||
|
||||
| catherham |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 7.7.2010 Репутация: нет Всего: нет |
Немного разобрался в классе string.
я подключаю билиотеку
И, если строка не пустая,то стандартный размер 15, в моём случае(возможно зависит от системы, не знаю). Поэтому при записи
у меня записывает, только строки длиной до 15 символов. Но почему если я указываю так
он всё равно записывает строки до 15 символов корректно, а остальные нет. Ведь по логике при этой записи строка, если она не 50 байт, должна записываться не правильно. Не понимаю, может объяснит кто? Хочу всё-таки разобраться, и записать не массив символов, а объект класса string |
||||||
|
|||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
и
несовместимо. Ты вообще читал, что тебе отвечали в теме ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| catherham |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 7.7.2010 Репутация: нет Всего: нет |
Но ведь объекты класса можно записывать в файл
|
|||
|
||||
| RastaDja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 337 Регистрация: 1.11.2010 Репутация: 3 Всего: 5 |
а что мешает сделать znb.cod[k].c_str() ? -------------------- The more closely you look at one thing, the less closely can you see something else. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Вот интересно, почему ты в этом уверен ? а какой задавать размер ? если znb.cod[k].length(), то как потом считывать ? Добавлено через 3 минуты и 2 секунды catherham, записать то можно, но прочитать потом корректно - далеко не все. смотри
что будет, если ты запишешь obj в файл ? А что будет, если потом считаешь ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |