2011-08-15 12 views
0

自分のプロジェクトに自分自身で作成したエラー/ログクラスを使用していますが、自分自身をファイルに格納/ロードすることもできます。より多くのオブジェクトを扱う際に私がより簡単になるように、私はファイルストリームをこの関数に渡して、ストリームの書き込み/読み取りメンバを使用します。std :: wfstreamを参照渡しできますか?write()とread()を正しく使用できますか?

と割引:

unsigned int HError::SaveToBufferW(std::wfstream& file) 
{ 
    _ErrorSaveStruct ess = {0}; 
    ESS.IsUNICODE = true; 
    ESS.ItemCount = 9999999; 
    file.write((wchar_t*)&ess,sizeof(_ErrorSaveStruct)/sizeof(wchar_t)); 
    return 0; 
} 

をロードする:節約のために

in.open(L"XError.err",std::ios::in | std::ios::out | std::ios::binary); 

:と

in.open(L"XError.err",std::ios::in | std::ios::out | std::ios::binary | std::ios::trunc); 

ロード

int HError::LoadFromBufferW(std::wfstream& file) 
{ 
    _ErrorSaveStruct ess = {0}; 
    file.read((wchar_t*)&ess,sizeof(_ErrorSaveStruct)/sizeof(wchar_t)); 
    return 0; 
} 

ファイルをチェックしたところ、の空白が書かれていることがわかりました。 ユニコード文字列を読み書きすると、すべてが動作し、文字列もファイル内で読み込み可能です。

編集:ここにあなたが

struct _ErrorSaveStruct 
{ 
    unsigned int MsgSize; 
    unsigned int TimeSize; 
    unsigned int LastErrorSize; 
    int ItemCount; 
    int errState; 
    bool InitMsg; 
    bool IsUNICODE; 
}; 
+0

_ErrorSaveStructの定義を確認できますか?あなたのコードは実際には_ErrorSaveStructが{wchar_t data [big];}だった場合にのみ機能します。それ以外のものは、コードが動作しないようです。 –

+2

参照渡しが問題ではない、それは動作します。バグはどこか他の場所です。 – john

+0

@Mooning Duck:どういう意味ですか?そのサイズを2で割ることができる場合は?私はすでにそれを確認しました:sizeof(_ErrorSaveStruct == 24)。 – BeschBesch

答えて

0

[OK]を行くには、何らかの方法で私の問題を回避するために別の答えを使用:

int main() 
{ 
HLib::_ErrorSaveStruct Ess = {0}; // just a namespace 
Ess.IsUNICODE = true; 
Ess.errState = 100; 
Ess.ItemCount = 9999; 

wchar_t* StringTest[1] = {L"WOORD"}; // same like (wchar_t[5]) 

FILE* iobuf = NULL; 

// create new in binary read-write mode 
if (_wfopen_s(&iobuf,L"WTest.err",L"wb+")==0) 
{ 
     //WRITING BLOCK 
    if (fwrite(&Ess,sizeof(Ess),1,iobuf) != 1) // sizeof_ErrorSaveStruct 
     std::cout << "Fail (Reading struct)"; 

    if (fwrite(StringTest,sizeof(wchar_t) * 5,1,iobuf) != 1) // size = 5 
     std::cout << "Fail (Reading string)"; 

    // reset content 
    SecureZeroMemory(&Ess,sizeof(Ess)); 
    SecureZeroMemory(StringTest,sizeof(wchar_t)*5); 

    fseek(iobuf,0,0); // rewind 
    fflush(iobuf); // flush because you switch from write to read 

    /// READING BLOCK 
    if (fread(&Ess,sizeof(Ess),1,iobuf) != 1) // sizeof_ErrorSaveStruct 
     std::cout << "Fail (Reading struct)"; 

    if (fread(StringTest,sizeof(wchar_t) * 5,1,iobuf) != 1) // size = 5 
     std::cout << "Fail (Reading string)"; 
    fclose(iobuf); 
} 

return 0; 

私は本当にストリームやファイルIOについて何かを学びました。他の解決策を考えると、私はが単一のパラメータ(int、bool)をstruct全体の代わりにwfstreamに渡すこともできます。 でも、バイナリフラグがセットされたstd :: fstreamを使用し、write()によってwchar_t文字列を渡すことができました。とにかく、このソリューションは私のために十分に機能し、私はそれについて本当に幸せです。

関連する問題