Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
gastelo56
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 18
#1

Запись char в бинарном режиме - C++

19.06.2013, 12:39. Просмотров 620. Ответов 10
Метки нет (Все метки)

Пишу в файл две структуры.

C++
1
2
3
4
5
6
struct ApRegFileHead
{
    char *rHead;
    unsigned int version;
    unsigned int rezerv;
};
и

C++
1
2
3
4
5
6
7
struct pMsg
{
    char *pMessage;
    size_t pSize;
    int pType;
    int pSource;
};
Заполнил структурку:
C++
1
pMsg msg = {"message", 1,1,1};

Собственно пишу в файл:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void ApReg::MakeFileHead() {
    if (_rmode == REG_MODE_NEW_FILE) {
        ApRegFileHead fHead = {"headmessage",htonl(2),htonl(2)};
        fwrite(&fHead.rHead,sizeof(fHead.rHead),1,_regFile);
        fwrite(&fHead.version,sizeof(fHead.version),1,_regFile);
        fwrite(&fHead.rezerv,sizeof(fHead.rezerv),1,_regFile);
    }
 }
 
char ApReg::MakeRecHead(pMsg *msg) {
        int _pType = htonl(msg->pType);
        int _pSource = htonl(msg->pSource);
        int _pSize = htonl(msg->pSize);
    
        fwrite(&_pType,sizeof(_pType),1,_regFile);
        fwrite(&_pSource,sizeof(_pSource),1,_regFile);
        fwrite(&_pSize,sizeof(_pSize),1,_regFile);
 
        return 0;
}


C++
1
2
3
4
5
6
void ApReg::Write(pMsg *msg) {
.....
    MakeRecHead(msg);
    fwrite(msg->pMessage, msg->pSize, 1, _regFile);
....
}
на выходе получаю в файле такую запись (см во вложении).

Почему слово message присутсвует, а headmessage нет
Миниатюры
Запись char  в бинарном режиме  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 12:48     Запись char в бинарном режиме #2
Цитата Сообщение от gastelo56 Посмотреть сообщение
C++
1
fwrite(&fHead.rHead,sizeof(fHead.rHead),1,_regFile);
вы пишите всегда столько байт сколько весит указатель,
sizeof(fHead.rHead) == 4 на 32-х битных платформах
gastelo56
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 18
19.06.2013, 12:54  [ТС]     Запись char в бинарном режиме #3
Цитата Сообщение от Jupiter Посмотреть сообщение
вы пишите всегда столько байт сколько весит указатель,
sizeof(fHead.rHead) == 4 на 32-х битных платформах
как мне взять размер строки?
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 13:04     Запись char в бинарном режиме #4
Цитата Сообщение от gastelo56 Посмотреть сообщение
как мне взять размер строки?
strlen(str) + 1
gastelo56
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 18
19.06.2013, 13:08  [ТС]     Запись char в бинарном режиме #5
Цитата Сообщение от Jupiter Посмотреть сообщение
strlen(str) + 1
тоесть я сделал так:

fwrite(&fHead.rHead,strlen(fHead.rHead)+1,1,_regFile);

но на выходе вместо "headmessage" получил "xОЗ"

указал размер вручную:
fwrite(&fHead.rHead,11,1,_regFile);

получил "xОЊ"

проверил в теле функции все ли верно со строкой:
printf(fHead.rHead);

вывело нормально "headmessage"
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 13:11     Запись char в бинарном режиме #6
gastelo56, вам ещё дополнительно нужно записать размер этой строки. А при чтени: сначала читать размер, а потом читать строку согласно этому размеру
gastelo56
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 18
19.06.2013, 13:13  [ТС]     Запись char в бинарном режиме #7
Цитата Сообщение от Jupiter Посмотреть сообщение
gastelo56, вам ещё дополнительно нужно записать размер этой строки. А при чтени: сначала читать размер, а потом читать строку согласно этому размеру
указал размер вручную:
fwrite(&fHead.rHead,11,1,_regFile);

получил "xОЊ"

проверил в теле функции все ли верно со строкой:
printf(fHead.rHead);

вывело нормально "headmessage"
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 13:25     Запись char в бинарном режиме #8
Если так?
C++
1
fwrite(fHead.rHead, 11, 1, _regFile);
gastelo56
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 18
19.06.2013, 22:10  [ТС]     Запись char в бинарном режиме #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Если так?
C++
1
fwrite(fHead.rHead, 11, 1, _regFile);
да, это решило проблему. Но вознки вопрос
почему тогда чар из структуры пишем fwrite(fHead.rHead, 11, 1, _regFile);
но если из етойже структуры писать инт fwrite(fHead.version,sizeof(fHead.version),1,_regFile); то ругается, и нужно &fHead.version
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 22:15     Запись char в бинарном режиме #10
Цитата Сообщение от gastelo56 Посмотреть сообщение
Но вознки вопрос
потому что первый параметр fwrite - const void* - указатель
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2013, 07:50     Запись char в бинарном режиме
Еще ссылки по теме:

C++ Прочитать файл в бинарном режиме с записью результата в string
Как прочитать файл в бинарном режиме по 32 байта C++
Чтение строки в бинарном режиме C++
C++ Не удаётся открыть файл в бинарном режиме
C++ Запись в бинарный файл в бинарном режиме: будут ли числа записаны в двоичной системе счисления?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 07:50     Запись char в бинарном режиме #11
Первым параметром должнет быть адрес переменной, которая будет записываться. Указатель - сам по себе адрес, поэтому к нему не нужно, в данном случае, применять операцию взятия адреса.
Yandex
Объявления
20.06.2013, 07:50     Запись char в бинарном режиме
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru