2015-06-09 33 views
1

我有一個二進制文件,我正在閱讀。在一個文件中,有一個已知數量的字節組成一個簡單的ASCII字符串(可能帶有換行符)。現在,我有:C++:從std :: string(&str [0])作爲緩衝區安全讀取文件?

void doSomething(istream &in) { 
    vector<char> buf(length + 1, '\0'); 
    in.read(&buf[0], length); 
    string str(&buf[0]); 
} 

但我意識到,它可能會更快地做到

void doSomething(istream &in) { 
    string str(length + 1, '\0'); // +1 needed? 
    in.read(&str[0], length); 
} 

我試圖尋找的標準,看是否字符串分配始終是連續的,或者如果它是安全做的事情喜歡這個。安全含義,不會意外讀入(寫入)內存而不是字符串的一部分。有人知道嗎?

+0

請定義_safe_更清楚。 「長度」從哪裏來?它是如何計算的? –

+0

長度來自文件,並且表示作爲字符串一部分的「已知字節數」(如上所述)。 – bombax

+2

重複這個? https://stackoverflow.com/q/25169915/241631 – Praetorian

回答

2

std::string分配總是連續的,至少在C++ 11中是如此。我相信在此之前它沒有明確定義,但沒有實現使用非順序存儲。

您不需要在std::string中爲空終止符顯式地添加空格。

+0

謝謝!您是否也碰巧知道在閱讀時是否需要包含null終結符,還是與實現有關? – bombax

+0

讀取stackoverflow.com/q/25169915/241631上的重複問題,答案是「[...]和您的代碼避免覆蓋終止NULL字符[...]」,這表明必須包含空字符?或者我誤解了? – bombax

+1

@bombax你可以寫任何在[0,'str.size()')範圍內的索引,而'str [str.size() - 1]'不一定是''\ 0''。 – bames53