2012-04-03 96 views
-1

倾倒在一个文本的整个结构是有可能转储整个结构为使用的CreateFile /写文件(WINAPI)如何使用WINAPI

我不想使用fstream的objects.So请不要建议的答案文件他们。 在此先感谢

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

我想这样做,用的WriteFile /的CreateFile API.Currently我正在做这样的

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

但产量是一些未知的符号。

+2

作为文本还是二进制,什么样的结构?请详细说明。 – 2012-04-03 11:06:05

+0

文本格式的正常值 – hardyz009 2012-04-03 11:08:48

+0

可能,但您为什么要这样做?首先知道结构是什么以及稍后如何解释内容将是一件好事。 – 2012-04-03 11:12:01

回答

4

如果您希望它是人类可读的,则不能只转储任意对象。

我建议实现一个方法,将对象的内容格式化为一个字符串。然后你可以使用任意数量的机制记录它。

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()); 

或者实现流插入操作符并将其直接传递给标准输出或文件流。

basic_ostream& operator<< (abc& val); // etc 

abc obj; 
std::cout << "Object contains : " << obj; 
+0

我想使用WriteFile/CreateFile API来完成它。 – hardyz009 2012-04-03 11:35:09

+0

@ hardyz009 WriteFile/CreateFile API只知道字节。它不理解关于只有4个整数的结构 - 或者16个字节坐在内存中。 WriteFile没有水晶球说“哦 - 这些实际上是整数,我会用ASCII码写十进制”。如果你想使用WriteFile,你需要首先将你的结构转换成ASCII码。 – SecurityMatt 2012-04-03 12:10:28

+0

@SecurityMatt,所以不可能只传递结构体的名称,并期望写入文件将其成员的值写入文本文件中,而无需将结构体转换为十进制。 – hardyz009 2012-04-03 12:59:32