如何在不读取格式化输入的情况下在istream上设置EOF?

时间:2009-04-02 16:52:15

标签: c++

我正在使用istream :: get()按字符逐个读取文件。如何用一些东西来结束这个函数来检查文件中是否有任何东西要读取格式(例如只有空格)并设置相应的标志(EOF,坏等)?

5 个答案:

答案 0 :(得分:1)

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

  

如果设置了skipws格式标志,并且构造函数未作为第二个参数( noskipws )传递true,则所有前导空白字符(特定于语言环境)。如果此操作耗尽了字符源,则该函数会同时设置failbiteofbit 内部状态标志

答案 1 :(得分:1)

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

std::cin >> std::ws

四年后问到这个问题的另一个版本的this comment

答案 2 :(得分:-1)

  

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

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

答案 3 :(得分:-1)

默认情况下,所有格式化的提取操作(operator>>()的重载)都会在提取项目之前跳过空白 - 您确定要采用这种方法吗?< / p>

如果是,那么您可以通过从my_istream派生新类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>)。

答案 4 :(得分:-1)

istream不会有太多帮助 - 它按设计运行。但是,它将实际读数委托给streambufs。如果你的streambuf包装器修剪尾随空格,那从该streambuf读取的istream将不会注意到它。