【发布时间】:2009-04-02 16:52:14
【问题描述】:
我正在使用 istream::get() 逐个字符地读取文件。我该如何结束这个函数,以检查文件中是否没有任何内容可读取格式化(例如,只有空格)并设置相应的标志(EOF、坏等)?
【问题讨论】:
标签: c++
我正在使用 istream::get() 逐个字符地读取文件。我该如何结束这个函数,以检查文件中是否没有任何内容可读取格式化(例如,只有空格)并设置相应的标志(EOF、坏等)?
【问题讨论】:
标签: c++
在流上构造一个istream::sentry。这将有a few side effects,我们关心的是:
如果设置了
skipws格式标志,并且构造函数没有作为第二个参数传递true(noskipws),则所有前导空白字符 (locale-具体)被提取和丢弃。如果此操作耗尽了字符源,则该函数同时设置failbit和eofbit内部状态标志
【讨论】:
您可以随时通过读取std::ws 从流中删除任意数量的前导(或尾随)空白。例如,如果我们从 STDIN 读取文件,我们会这样做:
std::cin >> std::ws
感谢this comment 在四年后提出的这个问题的另一个版本。
【讨论】:
我如何用一些东西来结束这个函数,以检查文件中是否没有任何东西可以读取格式化(例如,只有空格)?
空白字符是流中的字符。您不能假设流会为您进行智能处理。直到和除非,您编写自己的过滤流。
【讨论】:
默认情况下,所有格式化提取操作(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 不会有太大帮助 - 它按设计运行。但是,它将实际读取委托给流缓冲区。如果您的 streambuf 包装器修剪尾随空格,则从该 streambuf 读取的 istream 不会注意到它。
【讨论】: