2013-05-13 202 views
2

我是編程初學者,遇到問題。 我想寫一個結構到我的二進制文件。我不確定結果。這裏的結構:二進制文件應該是什麼樣子?

struct clientData 
{ 
    unsigned int id; 
    char name[25]; 
    char post[15]; 
    char degree[10]; 

    clientData(unsigned int, char*, char*, char*); 
}; 

正如你所看到的,我的結構包含一些字符串。 下面是主要問題: 我的字符串是否應該在最終的二進制文件中被重新轉換(所以它們在應用程序(如記事本等)中無法讀取? 因爲我的結果看起來像這樣(我不能添加圖像,所以我就貼吧):

萬里的EdgecombeМММММММММdocentММММММММpew1МММММММ

這是我怎麼寫二進制文件:

ofstream binary_1st("binary_input.dat", ios::out | ios::binary); 
... 
binary_1st.write((char*) &cl, sizeof(clientData)); 
... 
binary_1st.close(); 
+0

你想在二進制文件中使用什麼格式? – 2013-05-13 16:38:31

+1

作爲初學者,通常更容易堅持文本格式。 – MSalters 2013-05-13 16:39:50

+0

@MSalters我的學生和我的任務是使用二進制文件存儲數據,所以我無法避免它:D – 2013-05-13 16:55:39

回答

0

你寫了結構的文件原樣,沒有任何序列化或p ACKING。所以結構將被寫入,因爲它是字符串將是可讀的(如果他們是在代碼讀取),數字將號碼等

順便說一句,這個M的在

Miles Edgecombe МММММММММdocent ММММММММpew1 МММММММ 

意味着字符在將字符串寫入它們之前,結構中的數組不會被清零,因此末尾沒有尾隨零,因此'thrash'將寫在末尾。

+0

在我的情況下最有趣的是數字被重新轉換並且無法讀取(帶ID的第一個符號不可讀,因此無法粘貼) – 2013-05-13 16:45:04

+0

這是因爲文本編輯器試圖將您的數字表示爲ascii字符(或根據編碼組)。如果這個數字不是有效的字符代碼,它將不會在文本模式下正確顯示。然而,十六進制編輯器會告訴你真正的價值。 – maverik 2013-05-13 16:46:34

+0

這就是我困惑的原因。十六進制編輯器顯示我的十六進制值,但字符串根本沒有改變:) – 2013-05-13 16:54:39

0

我的字符串應該在最終的二進制文件中被重新轉換(所以它們 對於像記事本等應用程序是不可讀的)?因爲我的結果看起來像 這樣(我不能添加圖像,所以我只是將其粘貼):

不要擔心這一點。你的字符串可能不包含換行符。任何將二進制文件轉換爲文本格式的代碼都應該擔心記事本& c。

你可能不應該發明自己的二進制格式。但是如果你確實需要的話,那麼請留意以下幾點。

  • 確保它包含版本信息。
  • 要清楚數據大小,可能用具有固定32位或64位大小的東西代替int
  • 將您的整數字節逐字節存儲,以便它具有固定的endiannes。見http://linux.die.net/man/3/htons
  • 使用固定字符串編碼。 UTF-8。
  • 確保您知道您的字符串如何終止。可以在它們前面粘貼一個大小,或者在字符串之後寫出一個NUL字節(您的示例代碼都不可以)。

更新:我只注意到我的答案可能是不適合初學者很清楚,但我不想把它做成了一篇文章。重點是,逐字存儲結構可能不是一個好主意。如果您需要更詳細的信息,請詢問。

+0

我非常懷疑OP是否真的需要所有這些才能讓他簡單地玩轉。雖然是的,但在創建便攜式二進制格式時,這些要點非常重要,如果您只是保持較小的狀態,則確實沒有必要。 – 2013-05-13 16:48:15

+0

@ RichardJ.RossIII如果你只是堅持小國,文本格式更合適。如果你想以後能夠讀取數據,那麼你就必須遵循Adrian的建議。 – 2013-05-13 16:52:37

+0

正確。雖然如果OP在玩,他應該堅持文本。解析二進制文件並不容易,但它更有用。 – 2013-05-13 16:53:46

0

如果您想讓它在NotePad中可讀,則需要將文本寫入文本。使用<<運算符並使其超載如何表示數據。

要將數據寫入文本:

std::ostream& operator<<(std::ostream& os, const clientData& obj) 
{ 
    os << obj.id << " " << obj.name << " " << obj.post << " " << obj.degree; 
    return os; 
} 

... 

binary_1st << cl << std::endl; 

否則,你有數據+一些不可讀的編碼數據。如果存儲在char []中的字符串的長度小於數組的大小,即使您會在文件中看到垃圾。

+0

其實我想確保我以正確的方式使用二進制文件(我應該使用BINARY FILE來存儲我的數據),但我不確定它是否是因爲可讀的字符串。對不起,我的英語,我希望你明白:) – 2013-05-13 16:46:47

+0

ios :: binary只是一個格式選項(如果我可以這樣稱呼它)流。它不會自動爲您創建二進制文件。您可以選擇格式。 – maverik 2013-05-13 16:48:15

+0

@AlesDokshanin:當你將文件中的數據寫成二進制文件時,它可能是可讀的(例如字符序列)。所以,不要擔心。如果您希望寫入的數據不可讀,請在寫入之前嘗試對其進行加密或編碼。 – deepmax 2013-05-13 16:50:30

相關問題