2013-04-08 4 views
1

저는 크로스 워드 데이터를 바이너리 파일에 써야하는 cpp에 작은 백엔드를 작성하고 있습니다. 모든 데이터 멤버가 public 인 XWPuzzle 클래스를 만들었고 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; 
} 

서명, 버전 및 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 
+0

최소한 'XWPuzzle' 선언을 참조해야합니다. –

+0

xWord 객체는 어디에서 제작 되었습니까? 너의 계급 선언을보고 싶다. –

+0

지연되어서 죄송합니다. 나는 XWPuzzle의 선언을 추가했다. – artfuldev

답변

1

당신은 포인터에 정수를 캐스팅 에 의해 데이터 쓰기를 시도하고 이 포인터. 그건 틀렸어요. 당신은 체크섬 포인터를 가져 와서 쓰십시오.

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

그리드 및 userGrid 필드와 동일

+0

고마워요! 초보자 실수. – artfuldev