2013-04-08 21 views
1

我在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引發第一次機會異常(訪問衝突讀取位置錯誤)。我是否以錯誤的方式使用類的成員做錯了什麼?這是一個獨立的項目,而不是任何作業。現在我已經跑了兩天了。任何具體的幫助讚賞。謝謝。

我還有其他數據要寫入,除了這個類的。

編輯:

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'聲明。 – 2013-04-08 06:35:14

+0

xWord對象在哪裏製作?我想看看你的班級聲明。 – 2013-04-08 06:37:46

+0

抱歉,延遲。我已經添加了XWPuzzle的聲明。 – artfuldev 2013-04-08 06:54:31

回答

1

您鑄造的指針整數並試圖通過寫入數據這個指針。這是錯誤的。你應該得到指向校驗和的指針,然後寫入,然後寫入文件

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

與grid和userGrid字段相同

+0

非常感謝!新手錯誤。 – artfuldev 2013-04-08 08:42:45