[英]How do I set EOF on an istream without reading formatted input?
我正在使用istream :: get()逐個字符讀取文件。 如何用某種東西結束此功能,以檢查是否沒有剩余要讀取的文件格式(例如,僅空白)並設置相應的標志(EOF,壞等)?
在流上構造一個istream::sentry
。 這會有一些副作用 ,我們關心的是:
如果設置了
skipws
格式標志,並且未將構造函數作為第二個參數傳遞給true
( noskipws ), 則將提取並丟棄所有前導空白字符 (特定於語言環境的字符 )。 如果此操作耗盡了字符源,則該函數將同時設置failbit
和eofbit
內部狀態標志
如何用某種東西來結束此功能,以檢查文件中是否沒有剩余要讀取的格式(例如,僅空格)?
空格字符是流中的字符。 您不能假定流將為您執行智能處理。 直到並且除非您編寫自己的過濾流。
默認情況下,所有格式化的提取操作( operator>>()
重載operator>>()
在提取項目之前都會跳過空格-您確定要分攤此方法嗎?
如果是,那么您可以通過從istream
派生一個新類my_istream
並覆蓋每個operator>>()
來在最后調用以下方法來實現所需的目標:
void skip_whitespace() {
char ch;
ios_base old_flags = flags(ios_base::skipws);
*this >> ch; // Skips over whitespace to read a character
flags(old_flags);
if (*this) { // I.e. not at end of file and no errors occurred
unget();
}
}
這是很多工作。 我在這里省略了一些細節(例如,更通用的解決方案是重寫類模板basic_istream<CharT, Traits>
)。
istream不會有太大幫助-它按設計運行。 但是,它將實際讀取委托給streambufs。 如果您的streambuf包裝器修剪了結尾的空白,則從該streambuf讀取的istream讀數將不會引起注意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.