c++ - C++文本文件末尾的两个点

标签 c++ file-io char text-files fstream

事情是这样的,我有一个文本文件,其中包含一本书中的一些句子,我想阅读并计算其中的句子数量。我发现的一种方法是计算文件中的点数。它工作正常,直到最后一个字符。当读数到达最后一个字符(这是一个点)时,它会添加另一个点,我仔细检查了文本文件,最后只有一个点。当我在阅读过程中打印每个字符时,我看到最后的第二个点。这是我的代码:

#include <string>
#include <iostream>
#include <fstream>

using namespace std;

int main(void)
{
    ifstream files("assommoir.txt");
    char caractere;
    int n = 0;

    if (files.fail() == 0)
    {

        while (files.eof() == 0)
        {
            files >> caractere;
            cout << caractere;
            if (int(caractere) == 46)
                n++;
        }
        cout << n << "\n";
    }
    else
        cout << "reading problem detected" << endl;
}    

最佳答案

files.eof() 在您尝试阅读最后一个字符之后为真,而不是在您阅读完最后一个字符后为真。因此,files.eof() 在最后一个字符后成功,但在您执行 files >> caractere 后会引发标志。由于您此时不检查,caractere 未被修改(它仍然是一个点)并且您的程序继续运行直到再次循环。

您应该使用 while (files >> caractere),因为输入流可以转换为 bool 值,指示它是否处于有效状态。

关于c++ - C++文本文件末尾的两个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23772609/

相关文章:

java - 如何将参数传递给静态初始化 block

c - 将一个 char 数组分配给另一个,它也是 c 中函数的参数

javascript - 如何找到字符串中每次出现字符的索引(Javascript)?

c++ - C2143 : syntax error: missing ';' before '*' & C4430: missing type specifier - int assumed. 注意:C++ 不支持default-int

c++ - 为什么模板只能在头文件中实现?

java - 将对象反序列化到 PC 文件系统并用作资源?

python - 防止两个Python程序同时写入同一个文件

c++ 类型 'char*' 和 'const char [2]' 到二进制 'operator+' 的无效操作数

c++ - 不一致造成的static_cast困惑

c++ - std::wstring 和 LOGFONT 重载冲突 - 为什么?