std::wfstream是否可以通过引用传递,以及我是否能够正确使用write()和read()

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

本文关键字:是否 write read 引用 可以通过 wfstream std      更新时间:2023-10-16

我为我的项目使用了一个自制的错误/日志类,它也能够将自己存储/加载到文件中。为了使我在处理更多对象时更容易,我想通过引用将文件流传递给这个函数,然后使用流的写/读成员。

保存:

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

我检查了文件,发现除了whitespaces什么也没写。当我读/写unicode字符串时,一切都工作,字符串在文件中也是可读的。

编辑:给你

 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而不是整个结构体。也可以使用带有二进制标志 set的std::fstream并通过write()传递wchar_t字符串。无论如何,这个解决方案对我来说已经足够好了,我真的很高兴。