2013-03-12 114 views
3

我正在寫一個小程序,它以二進制文件的形式從16個字節的組中讀取字節(請不要問爲什麼),修改它們,然後將它們寫入另一個文件。爲什麼std :: fstream使用char *?

fstream::read函數讀取到char *緩衝,這是我最初傳遞到看起來像這樣的功能:

char* modify (char block[16], std::string key) 

修改是在block中,然後返回來完成。在漫遊SO的帖子時,我意識到使用std::vector<char>可能是一個更好的主意。我的下一個擔心是如何將char *轉換爲std::vector<char>。再次,SO gave me an answer

但現在我想知道的是:如果它這樣一個好主意,使用std::vector<char>代替char*,爲什麼fstream函數使用char*呢?

此外,將char*fstream轉換爲std::vector<char>首先是否是個好主意?

編輯:我現在認識到,因爲fstream::read是用來直接寫入對象的數據,所以需要char *。我現在必須修改我的問題。首先,爲什麼fstream::read沒有重載功能?其次,在我寫過的程序中,哪一個更好?

+1

不是真的知道這是有益的,但你可以讀入'的std :: VECTOR'直接使用類似'.read(VECT東西[0] ,16)'(或'.read(vect.data(),16)',如果你使用的是C++ 11),以避免使用'char *'中間人。只要確保使用'.resize'爲數據分配足夠的空間。 – Xymostech 2013-03-12 05:32:34

+1

我想說,不是所有的緩衝區都是'std :: vector '(有時你是一個給'char *'讀取數據的庫)。如果'std :: fstream'強制你使用'std :: vector '而不是允許多種變體(原始數組,'std :: array'等),那將會有點奇怪。另外,有時你正在讀取/反序列化數據直接進入一個類型(比如'int'),在這種情況下,std :: vector '就是......很奇怪。 – Cornstalks 2013-03-12 05:33:03

+0

@Xymostech:不會傳遞指針輕微地破壞了不使用指針的初始目的?或者傳遞一個指向'std :: vector'安全的指針? – 2013-03-12 05:36:27

回答

1

fstream()函數允許您使用char* s,因此您可以將它們指向任意預分配的緩衝區。 std::vector<char>可以調整大小以提供適當的緩衝區,但它會堆在一起,並且涉及分配成本。有時你也許想要讀取或寫入數據到內存中的特定位置 - 即使在共享內存中 - 而不是接受vector恰好分配的任何堆內存。此外,您可能希望在不包含vector頭文件的情況下使用fstream ...很高興能夠避免不必要的包含,因爲它減少了編譯時間。因爲你的緩衝區總是16字節大小,所以最好將它們作爲char [16]數據成員分配給合適的擁有對象(如果有的話)或堆棧中(即某個函數的局部變量)。

vector<>當替代方法是堆分配時更加有用 - 無論是因爲編譯時未知的大小,還是特別大,或者您希望更靈活地控制內存生存期。當你特別需要一些其他矢量功能時,它也很有用,例如後來改變元素數量,對字節進行排序等等 - 看起來你不太可能想要做任何這樣的事情,所以一個矢量提出問題在閱讀你的代碼的人的腦海裏,想知道你會做什麼沒有好處。儘管如此,​​與vector的選擇(基於您所陳述的要求)似乎更多的是品味而不是客觀利益。

+0

所以,如果我理解正確,你是說'fstream'使用'char *'來允許更好的控制? 另外,你認爲在我的情況下'char [16]'可能是更好的選擇? – 2013-03-12 05:38:13

+0

@VivekGhaisas不,它使用'char *'來有用。 – 2013-03-12 05:39:17

+1

可以說,它應該是'void *'是有用的。 – 2013-03-12 05:40:01

1

要將它與矢量一起使用,請勿將指針傳遞給矢量。取而代之的是,將一個指針傳遞到向量內容:

vector<char> v(size); 
stream.read(&v[0], size); 
+0

你會推薦我使用'std :: vector ',考慮到程序的作用? – 2013-03-12 05:54:24

+0

@Vivek:不,除非你需要動態大小或交換。 – 2013-03-12 06:38:12

+0

我確實需要交換單個字符的值,但我不需要任何動態的東西。所以最後,'std :: vector '或'char *'? – 2013-03-12 06:44:21

相關問題