簡體   English   中英

如何在不讀取格式化輸入的情況下在istream上設置EOF?

[英]How do I set EOF on an istream without reading formatted input?

我正在使用istream :: get()逐個字符讀取文件。 如何用某種東西結束此功能,以檢查是否沒有剩余要讀取的文件格式(例如,僅空白)並設置相應的標志(EOF,壞等)?

通過讀取std::ws ,您可以隨時從流中刪除任何數量的前導(或結尾)空格。 例如,如果我們正在從STDIN讀取文件,則將執行以下操作:

std::cin >> std::ws

歸功於四年后提出的對該問題的另一個版本的評論

在流上構造一個istream::sentry 這會有一些副作用 ,我們關心的是:

如果設置了skipws格式標志,並且未將構造函數作為第二個參數傳遞給truenoskipws ), 則將提取並丟棄所有前導空白字符 (特定於語言環境的字符 )。 如果此操作耗盡了字符源,則該函數將同時設置failbiteofbit 內部狀態標志

如何用某種東西來結束此功能,以檢查文件中是否沒有剩余要讀取的格式(例如,僅空格)?

空格字符是流中的字符。 您不能假定流將為您執行智能處理。 直到並且除非您編寫自己的過濾流。

默認情況下,所有格式化的提取操作( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM