簡體   English   中英

std::wfstream 可以通過引用傳遞並且我能夠正確使用 write() 和 read() 嗎?

[英]Can std::wfstream passed by-reference AND will I be able to use write() and read() properly?

我為我的項目使用自制的錯誤/日志類,它也能夠將自身存儲/加載到文件中/從文件中加載。 為了讓我在處理更多對象時更容易,我想通過引用此 function 來傳遞文件 stream,然后使用 ZF7B44CFAFD5C52223D5498196C8A2E7B 的寫入/讀取成員

保存:

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

加載:

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

為了節省:

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

加載:

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

我檢查了文件,發現只寫了空格 當我讀/寫一個 Unicode 字符串時,一切正常,並且該字符串在文件中也是可讀的。

編輯:給你 go

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

好的,使用另一個答案以某種方式繞過我的問題:

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)傳遞給 wfstream 而不是整個結構。 也可以使用設置了二進制標志的 std::fstream並通過 write() 傳遞 wchar_t 字符串。 無論如何,這個解決方案對我來說已經足夠好了,我對此感到非常高興。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM