Как записать членов класса в двоичный файл с помощью cpp?

Я пишу небольшой бэкэнд в cpp, где мне нужно записать некоторые данные кроссворда в двоичный файл. Я создал класс XWPuzzle со всеми его членами-данными, и xWord является объектом этого класса. Вот фрагмент кода, который я пытаюсь записать в двоичный файл:

#include"binIncludes.h"
int main(int argc, char** argv)
{
cout<<"Bin read-write Tester\n";
xWord.title="Yeah!\0";
xWord.author="Nobody\0";
xWord.grid=147;
xWord.userGrid=109;
xWord.clues[0]="as\0";
xWord.clues[1]="de\0";
xWord.clues[2]="re\0";
xWord.solution[0]="ASSET\0";
xWord.solution[1]="DEER\0";
xWord.solution[2]="REED\0";
xWord.checksum=(int)(xWord.title.at(0))+(int)(xWord.author.at(0))+xWord.grid+xWord.userGrid;
xWord.checksum+=(int)(xWord.clues[0].at(0))+(int)(xWord.clues[1].at(0))+(int)(xWord.clues[2].at(0));
xWord.checksum+=(int)(xWord.solution[0].at(0))+(int)(xWord.solution[1].at(0))+(int)(xWord.solution[2].at(0));
fstream file;
file.open("binTest.bin",ios::out|ios::binary);
file.write(SIGNATURE,sizeof(SIGNATURE));
file.write(VERSION,sizeof(VERSION));
file.write(TYPE,sizeof(TYPE));
file.write((char*)xWord.checksum,sizeof(xWord.checksum));
file.write(xWord.title.c_str(),xWord.title.size());
file.write(xWord.author.c_str(),xWord.author.size());
file.write((char*)xWord.grid,sizeof(xWord.grid));
file.write((char*)xWord.userGrid,sizeof(xWord.userGrid));
file.close();
cout<<"File written\n";
_getch();
return 0;
}

SIGNATURE, VERSION и TYPE — строки с нулевым символом в конце, но скомпилированная программа выдает ошибку, когда попадает в строку

file.write((char*)xWord.checksum,sizeof(xWord.checksum));

Отладчик генерирует исключение «Первый шанс» (ошибка определения местоположения при нарушении прав доступа) в MSVCR100.dll. Я делаю что-то неправильно, неправильно используя члена класса? Это самостоятельный проект, а не домашнее задание. Я бегаю за этим уже два дня. Любая конкретная помощь приветствуется. Благодарю.

У меня есть и другие данные, которые должны быть записаны в дополнение к данным из этого класса.

РЕДАКТИРОВАТЬ:

XWPuzzle.h:

#ifndef XWPULZZLE_H
#define XWPUZZLE_H

#include"binIncludes.h"
class XWPuzzle
{
public:
string title;
string author;
int grid;
int userGrid;
string clues[3];
string solution[3];
int checksum;
} xWord;

#endif

binDefines.h:

#ifndef BIN_DEFINES_H
#define BIN_DEFINES_H

#include"binIncludes.h"
#define SIGNATURE "BinFile\0"#define VERSION "0.1.1\0"#define TYPE "With Solution\0"
#endif

binIncludes.h:

#ifndef BIN_INCLUDES_H
#define BIN_INCLUDES_H

#include<iostream>
#include<conio.h>
#include<string>
#include<fstream>

using namespace std;

#include"binDefines.h"#include"XWPuzzle.h"
#endif

1

Решение

Вы приводите целое число к указателю и пытаетесь записать данные по этому указателю. Это неверно. Вы должны получить указатель на контрольную сумму, привести ее, а затем написать

file.write ((символ *) (&xWord.checksum), SizeOf (xWord.checksum));

То же самое с полями grid и userGrid

1

Другие решения

Других решений пока нет …