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

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

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

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

19.06.2013, 12:39. Просмотров 630. Ответов 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  в бинарном режиме  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2013, 12:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись char в бинарном режиме (C++):

Запись в файл в бинарном режиме - C++
Есть файл, 1.exe, как его открыть чтоб можно было записать в него свой hex код ?

Запись в бинарный файл в бинарном режиме: будут ли числа записаны в двоичной системе счисления? - C++
Если я записываю случайное четырехзначное число в бинарный файл, открываю его в бинарном режиме, то будут ли те числа записаны в двоичной...

Работа с файлом в бинарном режиме - C++
Всем здравствуйте. Нужна помощь или подсказка. Есть два файла размером до 200 мегабайт (в принципе размер файла произвольная величина)....

Чтение строки в бинарном режиме - C++
Необходимо прочитать файл .txt в бинарном режиме и записать в строку. ifstream in(FileNames.c_str(),ios::binary); int...

Открытие файла в бинарном режиме - C++
Помогите разобраться. Необходимо реализовать алгоритм шифрования AES128. Всё сделано, только шифруются не файлы, а ввожу в ручную 32...

Размер строки в бинарном режиме! - C++
Здорова господа!!! Имеется строка типа string в которую считано изображение. Как можно узнать сколько будет эта же строка занимать в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 12:48 #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  [ТС] #3
Цитата Сообщение от Jupiter Посмотреть сообщение
вы пишите всегда столько байт сколько весит указатель,
sizeof(fHead.rHead) == 4 на 32-х битных платформах
как мне взять размер строки?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 13:04 #4
Цитата Сообщение от gastelo56 Посмотреть сообщение
как мне взять размер строки?
strlen(str) + 1
gastelo56
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 18
19.06.2013, 13:08  [ТС] #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
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 13:11 #6
gastelo56, вам ещё дополнительно нужно записать размер этой строки. А при чтени: сначала читать размер, а потом читать строку согласно этому размеру
gastelo56
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 18
19.06.2013, 13:13  [ТС] #7
Цитата Сообщение от Jupiter Посмотреть сообщение
gastelo56, вам ещё дополнительно нужно записать размер этой строки. А при чтени: сначала читать размер, а потом читать строку согласно этому размеру
указал размер вручную:
fwrite(&fHead.rHead,11,1,_regFile);

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

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

вывело нормально "headmessage"
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 13:25 #8
Если так?
C++
1
fwrite(fHead.rHead, 11, 1, _regFile);
gastelo56
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 18
19.06.2013, 22:10  [ТС] #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
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 22:15 #10
Цитата Сообщение от gastelo56 Посмотреть сообщение
Но вознки вопрос
потому что первый параметр fwrite - const void* - указатель
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 07:50 #11
Первым параметром должнет быть адрес переменной, которая будет записываться. Указатель - сам по себе адрес, поэтому к нему не нужно, в данном случае, применять операцию взятия адреса.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2013, 07:50
Привет! Вот еще темы с ответами:

Не удаётся открыть файл в бинарном режиме - C++
Всем привет. Вроде делаю всё по примеру, но первый файл открывается, а второй файл (который пытаюсь открыть в бинарном режиме) проверку...

Работа файла в бинарном режиме записи - C++
Есть файл 1.exe, как его нужно открывать (в каком режиме ?) чтоб можно было удалять/перезаписывать/записывать в конец бинарный код ?

Поиск числа в файле, открытым в бинарном режиме - C++
Здравствуйте уважаемые дамы и господа, возник вопрос по поводу поиска числа в бинарном файле. Допустим имеется код: #include...

Как прочитать файл в бинарном режиме по 32 байта - C++
Здравствуйте, как считать файл в бинарном режиме (в двоичной системе счисления) по 32 байта, попутно записывая эти 32 байта в переменную...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.06.2013, 07:50
Ответ Создать тему
Опции темы

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