如何使用winapi在文本文件中转储整个结构

How to dump an entire structure in a textfile using winapi

本文关键字:转储 结构 文件 何使用 winapi 文本      更新时间:2023-10-16

是否可以使用CreateFile/Writefile(WINAPI)将整个结构转储到文件中

我不想使用fstream对象。所以请不要向他们建议答案。提前感谢

Struct abc
{
    int a;
    int b;
    char c;
}

我想使用WriteFile/CreateFile API来完成。目前我正在这样做

struct abc
{
    int a;
    int b;
    int c;
};
void main()
{   
    struct abc ob;
    ob.a=1;
    ob.b=2;
    ob.c=3;
    DWORD dwNumBytesWritten = 0;
    HANDLE hFile;
    hFile = CreateFile(FILENAME,
        FILE_APPEND_DATA, 
        FILE_SHARE_WRITE,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    WriteFile(hFile,
              (LPCVOID)&ob,
              sizeof(abc),
              (LPDWORD)&dwNumBytesWritten,
              NULL);
}

但是输出是一些未知的符号。

如果您想让任意对象可读,就不能直接转储它。

我建议实现一种方法,将对象的内容格式化为字符串。然后,您可以使用任意数量的机制对其进行日志记录。

class CLoggable
{
    public:
        virtual std::string GetContents() = 0;
};
struct abc : public CLoggable
{
    int a;
    std::string c;
    CSomeObject* pObj;
    virtual std::string GetContents()
    {
        std::string strBuffer;
        strBuffer += "a = ";
        strBuffer += std::to_string( static_cast< long long >( a ) );
        strBuffer += "c = ";
        strBuffer += c;
        strBuffer += "pObj = ";
        strBuffer += pObj == nullptr ? "Null object" : pObj->GetContents();
        // etc etc etc
        return strBuffer;
    }
};
// e.g.
abc obj;
logger.log( obj.GetContents() );

或者,实现流插入运算符,并将其直接传递给stdout或文件流。

basic_ostream& operator<< ( abc& val );   // etc
abc obj;
std::cout << "Object contains : " << obj;