2009-02-27 70 views
7

如何將C++中的結構內容寫入文本文件?我想要做的是,假設我有一個名爲A的結構,其數據成員是A.one,A.two等,我想將它們逐行寫入文本文件,如將C++結構轉儲到文本文件

結構一個
A.one =價值
A.two =值 ...

結構B
B.one =價值
B.two =值

基本上我想打轉儲..有沒有簡單的方法來做到這一點?什麼是最好的I/O方法呢? CFile的? iostream的?謝謝..有沒有更簡單的方法來轉儲類的成員數據的所有值?


編輯:廢話,感謝傢伙..

+0

相關:* [http://stackoverflow.com/questions/234724/how-to-serialize-in-c](http://stackoverflow.com/questions/234724/how-to -serialize-in-c) * [http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c](http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c) – dmckee 2009-02-27 02:13:30

回答

8

在C++中沒有反射,所以你必須做手工,例如(使用的iostream,爲simplicty):

dump_A(std::cout, "A", a); 

void dump_A(std::iostream& os, const char* name, A const& a) 
{ 
    os << "Structure " << name << '\n' 
     << name << ".one = " << a.one << '\n' 
     << name << ".two = " << a.two << '\n'; 
} 
5

C++不自省。也就是說,它不知道任何有關其結構的內容。您必須使用某種手動註釋或反射系統來執行此操作。

當然,如果您可以使用有關結構的硬編碼信息,則可以使用任何I/O方法轉儲信息。

例如:

struct A 
{ 
    int member1; 
    char member2; 
}; 

void PrintA (const A& a) 
{ 
    std::printf ("member1: %d\n", a.member1); 
    std::printf ("member2: %c\n", b.member2); 
} 

正如你可以看到這是乏味的,因爲它需要結構的深入瞭解,以及如果結構改變將不會自動更新。但是,反射系統的「正常」操作的開銷可能是一個缺點,尤其是如果你在學習的話。

+0

C++標準I/O類的使用可能會更安全嗎?如果member1和member2的類型將被更改,那麼您的代碼將無法正常工作。 – okutane 2009-02-27 02:17:44

+0

我不使用C++流IO作爲首選項。你說得對,在這種情況下它會更安全一些,但重點是代碼需要仔細更新以保持與結構定義的鎖定,無論你喜歡哪種IO方案,情況都是如此。 – 2009-02-27 02:20:30

0

這更適用到C比C++,但請記住,如果你不寫一個結構直接到文件(或網絡緩衝區),那麼結果將取決於機器和編譯器。整數將以主機字節順序寫入,並且該結構的編譯器填充字節也將包含在內。試圖讀取具有不同字節順序或不同編譯器指令的計算機上的緩衝區將不起作用

這種情況發生在類似的語言上(原諒):write(f,& A,sizeof(A));

0

IF這僅僅是一個結構,一個普通的舊C兼容的數據類型,與NO虛擬方法NO指針,然後作爲一個短期的雜牌你可以只使用:

struct Foo { int a, b; char c, d, e[50]; } f; 
write(fd, & f, sizeof(f)); 

但是,不要指望這是跨平臺的,甚至是在同一平臺上的交叉編譯器修訂。

I think I've discussed this before...