2012-04-03 61 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