Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 1
Регистрация: 07.10.2012
Сообщений: 107
1

Правильно записать бинарный файл

26.08.2016, 22:27. Показов 1169. Ответов 14
Метки нет (Все метки)

У меня имеется структура с массивом типа unsigned char[4] и строкой string[4].
Я пытаюсь записать число и небольшую "подпись" в бинарный файл, но что-то не получается..
Во-первых, значения мне заранее известны и они должны быть присвоены переменным из структуры.
Во-вторых, если одно из значений пустое, мне все равно нужно записать все четыре байта в файл в качестве нулей.
Мой кусок кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "stdafx.h"
#include <cstring>
#include <fstream>
#include <iostream>
using namespace std;
 
struct rigid_model
{
public:
    string Signature[4];
    unsigned char ModelType[4];
    unsigned char LodsCount[4];
    void to_file()
    {
        ofstream model("1.rigid_model_v2", ios::out | ios::binary);
        model << (char*)Signature;
        //      model << ModelType;
        model.close();
    }
};
 
int main()
{
    rigid_model data;
    memset((char*)data.Signature, 'RMV2', 4);
    data.to_file();
    return 0;
}
При компиляции получаю ошибку, а в файл записывается всякая ерунда.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2016, 22:27
Ответы с готовыми решениями:

Как правильно записать в бинарный файл структуру, в которой есть string?
Предположим есть вот такая структура struct MyStruct { int number; string str; }; Её...

Как правильно записать символьный массив в бинарный файл?
Хочу записать в бинарный файл две строки. 1 - &quot;даня&quot;, 2 - &quot;маша&quot;. открываю так: ofstream...

Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод)
Здравствуйте. Стоит задача записать в бинарный файл массив объектов student: class student {...

Не получается прочесть правильно текстовый файл в структуру а затем в бинарный файл
Нужно просто прочесть файл в структуру данных а потом оттуда записать в бинарный файл Вот как...

14
1466 / 1174 / 551
Регистрация: 08.01.2012
Сообщений: 4,524
27.08.2016, 07:06 2
C++
1
model.write(&data,sizeof(rigid_model));
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
27.08.2016, 09:28 3
Цитата Сообщение от Jox25 Посмотреть сообщение
У меня имеется структура с массивом типа unsigned char[4] и строкой string[4]
string-и, без сериализации, не годятся для бинарной записи. Или используй текстовые методы, или замени string-и на Си-строки.

Добавлено через 3 минуты
Цитата Сообщение от Jox25 Посмотреть сообщение
и строкой string[4]
Цитата Сообщение от Jox25 Посмотреть сообщение
C++
1
string Signature[4];
Это не строка, а массив из четырёх строк.
0
1 / 1 / 1
Регистрация: 07.10.2012
Сообщений: 107
27.08.2016, 10:25  [ТС] 4
Уже заменил string на unsigned char.
Как можно инициализировать в одну строку ?
0
1466 / 1174 / 551
Регистрация: 08.01.2012
Сообщений: 4,524
27.08.2016, 10:31 5
C++
1
2
3
4
...........
char Signature[5];//5 а не 4
...............
strcpy(data.Signature,"RMV2");
1
1 / 1 / 1
Регистрация: 07.10.2012
Сообщений: 107
27.08.2016, 12:13  [ТС] 6
Работает прекрасно, вот только мне нужно чтоб шло строго 4 байта "R M V 2" без нуль-терминатора на конце, т.к. после этих четырех бит идут следующие 4 бита информации (либо придется нуль-терминатор перезаписать значением, что идет после него)
0
1466 / 1174 / 551
Регистрация: 08.01.2012
Сообщений: 4,524
27.08.2016, 12:15 7
Лучший ответ Сообщение было отмечено Jox25 как решение

Решение

C++
1
2
3
4
...........
char Signature[4];
...............
memcpy(data.Signature,"RMV2",4);
1
1 / 1 / 1
Регистрация: 07.10.2012
Сообщений: 107
27.08.2016, 12:27  [ТС] 8
Сработало!
Еще нашел вот такой способ:
C++
1
2
3
    char *Signature;
-----------------------------
    data.Signature = "RMV2";
Добавлено через 3 минуты
Еще момент, записываю число "6" сразу после "RMV2" и оно записывается, но остальные 3 байта вместо нулей содержат какие-то значения непонятные:
C++
1
2
3
4
5
    unsigned char ModelType[4];
----------------------------------------
    data.ModelType[0] = 6;
----------------------------------------
    model.write((char*)ModelType, sizeof(ModelType));
0
1466 / 1174 / 551
Регистрация: 08.01.2012
Сообщений: 4,524
27.08.2016, 12:35 9
заполнен же только первый байт, остальное мусор
и в чем фишка записывать структуру частями, а не всю скопом? тогда уж и массивы можно побайтно
1
1 / 1 / 1
Регистрация: 07.10.2012
Сообщений: 107
27.08.2016, 12:44  [ТС] 10
Пытался, но тогда какой-то бред записывается снова:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct rigid_model
{
    char *Signature;
    unsigned char ModelType[4];
    unsigned char LodsCount[4];
 
    void to_file(rigid_model &val)
    {
        ofstream model("1.rigid_model_v2", ios::out | ios::binary);
        model.write((char*)&val, sizeof(val));
        model.close();
    }
};
 
int main()
{
    rigid_model data;
    data.Signature = "RMV2";
    data.ModelType[0] = 6;
 
    data.to_file(data);
    return 0;
}
0
1466 / 1174 / 551
Регистрация: 08.01.2012
Сообщений: 4,524
27.08.2016, 13:00 11
Лучший ответ Сообщение было отмечено Jox25 как решение

Решение

это из-за data.Signature = "RMV2"; если через memcpy нормально должно быть
т.к. в 1-м случае где-то в оперативке висит "RMV2" ее адрес и присваивается/записывается , а нужно char Signature[4]; указатели увлекательная вещь
1
1 / 1 / 1
Регистрация: 07.10.2012
Сообщений: 107
27.08.2016, 13:10  [ТС] 12
Да, сработало на ура, большое спасибо!
А не знаете как в свободные(не занятые, но выделенные байты) записать нули или сделать так, чтоб были сначала все нули, а потом необходимые нули перезаписались?
0
1466 / 1174 / 551
Регистрация: 08.01.2012
Сообщений: 4,524
27.08.2016, 13:16 13
а там точно 4 разных значения могут быть?
ну как вариант *(int*)data.ModelType = 6;
1
1 / 1 / 1
Регистрация: 07.10.2012
Сообщений: 107
27.08.2016, 13:22  [ТС] 14
С ModelType довольно просто вышло, а вот с новой строкой потруднее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct rigid_model
{
    char Signature[4];
    unsigned char ModelType[4];
    unsigned char LodsCount[4];
    char SkeletonName[128];
 
    void to_file(rigid_model val)
    {
        ofstream model("1.rigid_model_v2", ios::out | ios::binary);
        model.write((char*)&val, sizeof(val));
        model.close();
    }
};
 
int main()
{
    rigid_model data = { };
    memcpy(data.Signature, "RMV2", 4);
    data.ModelType[0] = 6;
    data.LodsCount[0] = 4;
    memcpy(data.SkeletonName, "rome_man_game", 128);
 
    data.to_file(data);
    return 0;
}
Вместо нулей после rome_man_game записывается такое
0
1466 / 1174 / 551
Регистрация: 08.01.2012
Сообщений: 4,524
27.08.2016, 13:33 15
каких нулей? "rome_man_game" присутствует? а остальное мусор , кому он мешает? предварительный memset и strlen("rome_man_game") могут помочь
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2016, 13:33

Записать в бинарный файл произвольные натуральные числа. Переписать в другой файл те элементы, которые кратны К
Помогите, пожалуйста! есть задание: Записать в файл N произвольных натуральных чисел. Переписать...

Данные записать в файл F1.txt, затем прочитать оттуда, обрабатывались и записывались в бинарный файл F2.bin с проверкой
Никак не получается отладить в BC++ 3.1. Как сделать в классах так, чтобы введённые данные...

Записать в бинарный файл матрицу
Возможно ли записать в бинарный файл матрицу (например, 5х6)? Если да, то каким образом? Нигде не...

Прочитать/записать бинарный файл
Есть текстовый файл записанный в бинарной форме как его вернуть обратно в текстовый формат? И как...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru