它是完全可以(根據標準=良好定義的行爲)來調用:std :: ifstream :: read或std :: ofstream ::用零參數寫入?
mystream.read(buffer, 0);
或
mystream.write(buffer, 0);
(當然,什麼也不會被讀取或寫入)。 我想知道在調用這兩個函數之一之前,如果提供的大小是否爲空,我是否需要測試它。
它是完全可以(根據標準=良好定義的行爲)來調用:std :: ifstream :: read或std :: ofstream ::用零參數寫入?
mystream.read(buffer, 0);
或
mystream.write(buffer, 0);
(當然,什麼也不會被讀取或寫入)。 我想知道在調用這兩個函數之一之前,如果提供的大小是否爲空,我是否需要測試它。
是的,行爲是明確定義的:兩個函數都會經過未格式化輸入/輸出函數的運動(構建哨兵,設置失敗位,如果eofbit被設置,必要時刷新綁定流),然後它們會去這個子句:
§27.7.2.3[istream.unformatted]/30
字符被提取並存儲直到發生以下情況:
- n個字符被存儲;
§27.7.3.7[ostream.unformatted]插入/ 5
字符,直到發生以下情況
- n個字符被插入;
「存儲/插入零字符」在存儲或提取任何內容之前爲真。在實際的實現
看,我看到for (; gcount < n; ++gcount)
in libc++或sgetn(buffer, n);
in stdlibc++它具有equivalent loop
從27.7.2.3 Unformatted input functions/1
另一個提取給了我們一個線索,大小爲零的輸入緩衝器是有效的情況下:
格式化輸入以非零大小作爲參數的字符數組的函數還應該在數組的第一個位置存儲空字符(使用charT())。
u必須取得製造規模0..nothing其他 – Anirudha
的特殊情況,我敢肯定,沒有什麼大不了的發生。 – Archimaredes
@Archimaredes,我不確定。我隱約記得當我嘗試這個時MSVC發出斷言。你確定嗎? –