2013-04-08 3 views
1

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

#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; 
} 

ПОДПИСЬ, версия и тип нулевыми байтами, но скомпилированная программа выдает ошибку, когда он попадает в линию

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

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

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

EDIT:

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 
+0

Нам нужно увидеть хотя бы декларацию XWPuzzle. –

+0

Где выполнен объект xWord? и я хочу увидеть вашу декларацию класса. –

+0

Извините за задержку. Я добавил объявление XWPuzzle. – artfuldev

ответ

1

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

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

То же самое с сеткой и полями userGrid

+0

Большое спасибо! Ошибка новичка. – artfuldev