std::wfstream是否可以通过引用传递,以及我是否能够正确使用write()和read()
Can std::wfstream passed by-reference AND will I be able to use write() and read() properly?
我为我的项目使用了一个自制的错误/日志类,它也能够将自己存储/加载到文件中。为了使我在处理更多对象时更容易,我想通过引用将文件流传递给这个函数,然后使用流的写/读成员。
保存:
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字符串。无论如何,这个解决方案对我来说已经足够好了,我真的很高兴。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 是否可以从从 QPrintPreviewDialog 调用的 QPrinter 对话框中删除"Write to PDF"?
- ios::app 模式和 fstream::write 是否在某种程度上彼此不兼容
- std::wfstream是否可以通过引用传递,以及我是否能够正确使用write()和read()
- 检查write()/send()是否可以处理整个缓冲区而不阻塞,否则失败(没有部分写入)