Можно ли передать std :: wfstream по ссылке И смогу ли я правильно использовать write () и read ()? - PullRequest
0 голосов
/ 15 августа 2011

Я использую самостоятельно созданный класс ошибок / журналов для своего проекта, который также может сохранять / загружать себя в / из файла. Чтобы мне было легче при обработке большего количества объектов, я хочу передать поток-файл посредством ссылки на эту функцию, которая затем использует член потока записи / чтения.

Сохранить с помощью:

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-строку, все работает, и строка также читается в файле.

Изменить: здесь вы идете

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

1 Ответ

0 голосов
/ 16 августа 2011

хорошо, использовал другой ответ, чтобы каким-то образом обойти мою проблему:

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 с установленным двоичным флагом и передавать строку wchar_t через write (). Во всяком случае, это решение работает достаточно хорошо для меня, и я очень рад этому.

...