2010-07-25 29 views
1

我創建了一個用於處理二進制文件的小工具。參與讀取文件並處理它們的模板和所有的功能都與此類似:處理二進制文件 - 模板化函數問題

template <class T> void processFile(const char* fileName); 

模板參數T用於確定將被讀出並作爲一項處理數據的大小。我不知道如何正確地說,所以這是一個小例子(請注意,這些是用hexeditor看到的二進制數據)。文件內容:

BEEF1234DEAD5678 

隨着T是unsigned char時,項目有:BE EF 12 34 DE AD 56 78
隨着T是unsigned int類型,項目有:BEAF1234 DEAD5678
隨着T是一個雙:BEAF1234DEAD5678

(請注意,我假設這裏的unsigned char是1個字節,unsigned int是4個字節,double是8個字節大)。T也用於STL容器,因爲我用它們ot(矢量,地圖和列表用於處理文件所涉及的許多功能)。一切工作完美罰款與內置數據類型(char,int等)。

現在我的問題是什麼:我希望能夠使用不同於1,4,8的尺寸。例如16,32甚至6,10,14等。據我所知,這些尺寸沒有內置類型。我怎樣才能做到這一點?我主要關心的是我需要STL容器中的數據,並使用sort()作爲例子。 POD結構會起作用嗎?請注意,我主要使用C函數進行讀取(這裏沒有流,但有一些memcpy和memcmp,fread等)。

對不起,不提供更多的代碼,我現在使用我的備用筆記本電腦。但我相信更多的代碼不應該是必要的。如果是這樣,我明天會提供。

+0

使用任意精度算術庫? – Gian 2010-07-25 19:03:05

+0

沒有圖書館,依賴性越少越好。有沒有辦法以一種清潔有效的方式來做到這一點,或不是? – PeterK 2010-07-25 19:14:09

回答

2

如果我正確理解您的問題,答案是肯定的:您應該能夠使用合適的POD類型專門化您的模板功能。但是,您需要定義一個成員operator<()才能使用std::sort()

以下POD可能在一般情況下對你有用(肯定會有增加了一倍排序越好):

template <int N> 
struct MyFill{ 
    char contents[N]; 
    bool operator<(const MyFill<N>& other){ 
    for (int i=0; i<N; ++i){ 
     if (contents[i]!=other.contents[i]){ 
     return (contents[i]<other.contents[i]); 
     } 
    } 
    return false; 
    } 
}; 
+0

謝謝,這看起來不錯! – PeterK 2010-07-26 06:33:09

0

使用運營商< <提取數據。這樣T的大小和是否可以排序不是你的問題。所以得到C++流,我們放棄fscanf爲std :: ifstream是有原因的。

memcpy或memcmp實際上並不安全,許多C++類型,並且使用它們是您絕對應該減少的一種習慣。