【发布时间】:2016-09-26 13:22:51
【问题描述】:
我想检查一个流(实际上是一个 ifstream)是否以换行符结尾。我想出了这个:
bool StreamEndsWithNewline(std::basic_istream<char> & the_stream)
{
if (the_stream.peek() == EOF) {
the_stream.clear(); //clear flags set by peek()
return false;
}
std::string line = "blah";
while (std::getline(the_stream, line)) {
// ...
}
return line.empty();
}
这个想法是,如果流的最后一行有一个\n 结束字符,while 循环将进行一次额外的迭代(因为尚未达到 eof),其中空字符串将分配给 line 参数.
“空”流的特殊情况必须单独处理。
它似乎适用于 Windows (vs2010)。我一般可以这样做吗?
【问题讨论】:
-
文件流必须以换行符结尾。此测试将检测仅一个换行符或以两个或多个换行符结尾的流。
-
不以换行符结尾的文本流在 C 或 C++ 中不是有效的输入流。不需要对该流的输入操作进行合理处理。
-
所以使用 std::stringstream the_stream(""); the_stream
-
@PeteBecker 在 C 或 C++ 中,文件可以以它喜欢的任何内容结尾,文件流和文本流也是如此。如果最后的换行符不存在,
std::getline()和fgets()都会正确运行。 -
不要使用 in_avail。它仅显示非阻塞读取的可用字符数(0 == 下一次读取可能会或可能不会发送字符)