2013-04-03 81 views
1

我調查過,如果緩衝區中沒有足夠的空間,則方法ifstream::readsome(buf, size)不會讀取所有字節。例如:ifsream :: readsome問題。緩衝區超過

我有緩衝區:4096字節。從文件開始偏移:6個字節。 我打電話給ifstream::readsome(buf, 4097)

的功能,結果是4090所以,如果我想讀其餘7個字節我一定要打電話

ifstream::readsome(buf + 4090, 7)

問題是:爲什麼這種功能以這種方式實現?我沒有看到任何問題處理超出方法ifstream::readsome(buf, size)內的緩衝區。

編譯器:MSVC 11(VS 2012)

謝謝你的回答。

回答

3

因爲這就是​​的意思。它調用 任何的虛擬功能在streambuf(其可以 塊);它被定義爲只返回中的字符,當前的 在緩衝區中。

如果您需要更多,那麼你應該使用read

2

它不能保證,那你的緩衝總是會完全充滿,所以它可能發生,你真的只是4090字節而不是4906個字節。

從在緩衝器 可用cplusplus.com


讀數據提取到從由s指向的數組中的數據流,並將它們存儲n個字符,一旦停止由相關聯的數據流緩存器保持在內部緩衝器對象(如果有的話)用完字符,即使尚未到達文件結尾。

功能是指用於讀取從某些類型的異步資源,最終可能等待更多的字符數據,因爲它停止只要內部緩衝器耗盡提取字符,避免了潛在的延遲。

注意,該功能依賴於相關聯的行爲是大多的流的特定數據流緩存器對象的內部爲標準類實現定義的。

在內部,該函數訪問由第一構造崗哨對象(noskipws設置爲true)的輸入序列。然後(如果是),它通過調用其成員函數in_avail來檢查相關流緩衝區對象當前有多少個字符,並通過調用sbumpc(或sgetc)提取多個字符。最後,它在返回之前銷燬哨兵對象。

通過調用成員gcount可以訪問此函數成功讀取和存儲的字符數。


查看here這篇文章。