【问题标题】:How do I set EOF on an istream without reading formatted input?如何在不读取格式化输入的情况下在 istream 上设置 EOF?
【发布时间】:2009-04-02 16:52:14
【问题描述】:

我正在使用 istream::get() 逐个字符地读取文件。我该如何结束这个函数,以检查文件中是否没有任何内容可读取格式化(例如,只有空格)并设置相应的标志(EOF、坏等)?

【问题讨论】:

    标签: c++


    【解决方案1】:

    在流上构造一个istream::sentry。这将有a few side effects,我们关心的是:

    如果设置了skipws 格式标志,并且构造函数没有作为第二个参数传递true (noskipws),则所有前导空白字符 (locale-具体)被提取和丢弃。如果此操作耗尽了字符源,则该函数同时设置failbiteofbit 内部状态标志

    【讨论】:

      【解决方案2】:

      您可以随时通过读取std::ws 从流中删除任意数量的前导(或尾随)空白。例如,如果我们从 STDIN 读取文件,我们会这样做:

      std::cin >> std::ws
      

      感谢this comment 在四年后提出的这个问题的另一个版本。

      【讨论】:

        【解决方案3】:

        我如何用一些东西来结束这个函数,以检查文件中是否没有任何东西可以读取格式化(例如,只有空格)?

        空白字符是流中的字符。您不能假设流会为您进行智能处理。直到和除非,您编写自己的过滤流。

        【讨论】:

        • 是的,我要问的基本上是如何设置与格式化读取(使用>>)在调用后所做的相同的事情,如果我有一个带有字符串的文件和然后20个换行符,读入字符串后会设置EOF标志?
        • 换行符也是字符。我想我已经给你答案了。
        • 不,看,如果我有一个内容为“String”的文件并且我执行 string TakenIn; FileWithNewlines>>TakenIn; FilewithNewlines.eof(); //这将返回true
        • 该字符串后面应该有一堆换行符,但任何空格都可以。
        • 如果您知道字符串的数量,请在读取所有字符串后将 eofbit 设置为 true。
        【解决方案4】:

        默认情况下,所有格式化提取操作(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>)。

        【讨论】:

          【解决方案5】:

          istream 不会有太大帮助 - 它按设计运行。但是,它将实际读取委托给流缓冲区。如果您的 streambuf 包装器修剪尾随空格,则从该 streambuf 读取的 istream 不会注意到它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-10-18
            • 1970-01-01
            • 2018-01-31
            • 2011-08-11
            • 1970-01-01
            • 2013-01-28
            • 1970-01-01
            • 2014-06-21
            相关资源
            最近更新 更多