2017-04-23 47 views
0

在我正在閱讀的書中,它開始討論二進制文件,以及如何輸出到二進制文件,類似於我們如何輸出到文本文件。所以我開始閱讀更多,並想嘗試一下;然而,我遇到了一個看似簡單的問題,但考慮到我對二進制文件缺乏理解,我並沒有正確理解它。在C++中輸出爲二進制文件時遇到困難

所以我們可以說我創建了一個結構和一個函數。如下所示。現在

struct celebrities 
{ 
    char name[15]; 
    char lastName[15]; 
}; 
void BinaryCreation(celebrities); 
int main() 
{ 
    celebrities actors = { "Denzel", "Washington" }; 

    BinaryCreation(actors); 

    system("pause"); 

} 

,我將創建一個二進制文件:

void BinaryCreation(celebrities actors) 
{ 

     fstream file; 
     file.open("binaryfile.txt", ios::binary | ios::out); 

現在,在書中也指出,我應該寫類似下面的輸出成二進制:

file.write(address, size) 

這是哪裏讓人困惑,看到如果我有一個結構,我到底該怎麼做?我嘗試了以下內容:

file.write(&actors.name, sizeof(actors.name)); 
file.write(&name, sizeof(name)); 

也試過重新解釋轉換。 我也做了以下

file.write(actors.name, sizeof(actors.name)); 

這沒有錯誤的意識的工作,但它會輸出到文本格式(ASCII)文件。

我確定這很簡單,我忽略了一些東西,但目前我無法弄清楚。

+1

將輸出類型更改爲二進制不會奇蹟般地將您的文本更改爲其他內容。它仍然是文本,仍然會被寫爲相同的值。區別在於二進制輸出可以包含不是文本的字符(如NULL,或0x01或0x02)。 –

+0

@KenWhite我明白了,這就是把我拋棄的原因,我期待着一堆符號,而是得到了相同的文字。感謝您的意見。 – ReMaKe

回答

1

正確的方法寫對象的原始記憶的內容將是:

file.write(reinterpret_cast<char *>(&actors), sizeof(actors)); 

但它會輸出到文本格式(ASCII)文件。

那麼,你的結構只包含文本,所以文本是你打開它時會看到的。

另外我猜你沒有在十六進制編輯器中打開文件。如果你這樣做了,你會發現每個字段佔用15個字節,而不管每個字符數組中包含的文本佔用的空間是否更少。在您用來查看文件內容的程序中,字段之間的額外填充字節可能不會被表示爲可打印字符。

例如,給定此程序:

#include <iostream> 

struct celebrities 
{ 
    char name[15]; 
    char lastName[15]; 
}; 

int main() { 
    celebrities actors = { "Denzel", "Washington" }; 

    std::cout.write(reinterpret_cast<char *>(&actors), sizeof(actors)); 

    return 0; 
} 

編譯此和管道程序的輸出到xxd給出以下:

0000000: 4465 6e7a 656c 0000 0000 0000 0000 0057 Denzel.........W 
0000010: 6173 6869 6e67 746f 6e00 0000 0000  ashington..... 

每個字段佔用恰好15個字節。空字符串終止符之後的未使用空格是附加的空字符(字節0)。如果以前存儲過一個較長的字符串,則可能會在輸出文件中看到它的殘餘部分。

如果我們#include <cstring>並直接調用上面在上面的程序中加入這一行std::cout.write()

std::strcpy(actors.lastName, "Whitaker"); 

現在正在運行的程序產生這樣的內容:

0000000: 4465 6e7a 656c 0000 0000 0000 0000 0057 Denzel.........W 
0000010: 6869 7461 6b65 7200 6e00 0000 0000  hitaker.n..... 

注獨行n,左從以前的價值結束時,「華盛頓」。

+0

是的,第二個代碼工作。我一直認爲二進制實際上是符號和數字,基本上就是你輸出的方式。我將下載一個十六進制編輯器來檢查它。 – ReMaKe

+0

@ReMaKe技術上二進制文件(實際上所有文件)都沒有固有含義;需要對他們的內容進行解釋,以便他們有用。以ASCII格式存儲在內存中的數據以ASCII格式寫出(除非它首先被編碼爲其他內容),所以你在輸出文件中得到的是每個數組中存儲的內容 - 這是ASCII。所以這個文件看起來像文本,因爲,那就是存儲在它裏面的東西!請注意,「我的輸出」是程序的輸出*通過一個十六進制轉儲工具*,它顯示每個字節的十六進制代碼。 – cdhowie

+0

我明白了。我確信這本書會在接下來的幾頁,章節中解釋它,但是我是否有任何直接的理由要輸出到二進制文件,而不是常規的輸出文件? – ReMaKe