2011-03-31 84 views
7

當試圖想出一個答案this question,我寫了這個小測試程序:使用int作爲字符類型的iostreams可以嗎?

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <iterator> 
#include <algorithm> 

void writeFile() { 
    int data[] = {0,1,2,3,4,5,6,7,8,9,1000}; 

    std::basic_ofstream<int> file("test.data", std::ios::binary); 
    std::copy(data, data+11, std::ostreambuf_iterator<int>(file)); 
} 

void readFile() { 
    std::basic_ifstream<int> file("test.data", std::ios::binary); 
    std::vector<int> data(std::istreambuf_iterator<int>(file), 
     (std::istreambuf_iterator<int>())); 

    std::copy(data.begin(), data.end(), 
       std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl; 
} 


int main() 
{ 
    writeFile(); 
    readFile(); 

    return 0; 
} 

它按預期工作,將數據寫入文件,並讀取一個文件後,它打印正確:

0 1 2 3 4 5 6 7 8 9 1000 

但是,我不知道是否有任何缺陷(字節序問題放在一邊,你總是有這些二進制數據打交道時)?這是否允許?

回答

2

在任何 但char或wchar_t上實例化任何iostream類或basic_string,但未提供特定的自定義特徵類 是未定義的行爲;我見過的大多數庫都將它定義爲 做了些什麼,但是這個定義通常沒有被指定,並且在VC++和g ++(我所看到的兩種情況)之間有所不同,它們是 。如果你定義並使用你自己的特質類, 的一些功能應該可以工作。

對於幾乎所有的格式的插入器和提取器(所述<<>>運營商),的istreamostream委託給在 區域設置各個方面;如果使用其中任何一種,則必須採取步驟 確保這些工作正常。 (這通常意味着提供了一個新的 numpunct方面。)

即使你只使用streambuf(如你的例子),filebuf 使用的codecvt方面。並且實現並不需要提供 codecvt,如果是這樣,可以在 之內做任何它想做的事情。由於filebuf總是向 文件寫入並讀取char,因此此翻譯必須執行某些操作。我實際上寧願 驚訝你的代碼工作,因爲這一點。但是你仍然不知道磁盤上的實際內容,這意味着你不能記錄它, 這意味着你將來無法閱讀它。

如果你的目標是編寫二進制數據,你的第一步應該是到 定義二進制格式,然後寫入 執行它的讀寫功能。可能使用可能使用的實際輸入和輸出 一個basic_streambuf<char>了iostream < <和語法>>和 ;一個basic_streambuf<char>你已經仔細的 「C」語言環境充滿。或者,而不是定義自己的二進制格式,只需使用現有的 ,如XDR。 (全本段的假設要 保留數據,後來讀它。如果這些只是臨時文件, 單次運行過程中溢出的臨時內部數據到磁盤, 將在該月底被刪除程序執行,簡單的解決方案 是有效的。)

4

它按預期工作。

我不知道你期待什麼?

這可以嗎?

這可能不是便攜式的。數據流依賴於char_traits以及標準中定義的僅用於charwchar_t的方面。一個實現可以提供更多,但我敢打賭,你依賴於這些模板的最小默認實現,而不是有意識的實現int。如果更深入的使用會導致問題,我不會感到驚訝。

+0

嗯,這證實了我的懷疑。 – 2011-03-31 09:19:30

+0

這意味着,如果我真的想要的話,我可以專門爲''char_traits'自己int'。 – 2011-03-31 10:13:18

+0

+1,雖然我認爲這是非常明顯的預期。 – 2011-03-31 10:29:49

相關問題