逐个字符地阅读文本文档

时间:2010-07-02 04:47:15

标签: c++ text

我在无限循环中使用ifstream infile.get()逐个字符地读取文本文件。

这位于无限循环内部,并且一旦达到文件条件结束就应该突破它。 (EOF)。 while循环本身位于void类型的函数中。

这是伪代码:

void function (...) {
    while(true) {
        ...
        if ( (ch = infile.get()) == EOF) {return;}
        ...
    }
}

当我在屏幕上“cout”字符时,它会遍历所有字符,然后继续运行输出显示为空格的内容,即它永远不会中断。我不知道为什么。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

在C ++中,您不会将返回值与EOF进行比较。相反,您可以使用诸如good()之类的流函数来检查是否可以读取更多数据。像这样:

while (infile.good()) {
  ch = infile.get();
  // ...
}

答案 1 :(得分:1)

尝试将函数转换为int 1并在到达EOF时返回1

答案 2 :(得分:1)

一种使得从文件中读取并正确检测文件末尾的习惯用法是将读取和测试组合成单个原子事件,例如:

while (infile >> ch)

或:

while (std::getline(infile, instring))

当然,您还应该考虑使用标准算法,例如copy

std::copy(std::istream_iterator<char>(infile),
          std::istream_iterator<char>(),
          std::ostream_itertror<char>(std::cout, "\n"));

一个小注:默认情况下,使用>>阅读会跳过空格。当你逐个字符输入/处理时,你通常不希望这样。幸运的是,禁用它非常简单:

infile.unsetf(std::ios_base::skipws);

答案 3 :(得分:0)

它不起作用的原因是get()返回一个int,但你将输入用作char。

当你将get()的结果赋给char时,只要读取的最后一个字符是一个字符就可以了。但是如果读取的最后一个字符是特殊字符(例如EOF),则在分配给char时它将被截断,因此随后与EOF的比较将始终失败。

这应该有效:

void function (...) 
{
    while(true) 
    {
        ...
        int value;
        if ( (value = infile.get()) == EOF) {return;}
        char ch = value; 
        ...
    }
}

但应该注意的是,使用更标准的模式更容易,其中读取是作为条件的一部分完成的。不幸的是,get()没有给你这个功能。所以我们需要切换到使用迭代器的方法。

请注意,标准istream_iterator将无法正常工作(因为它忽略了空格)。但你可以使用istreambuf_iterator(注意istream之后的buf),它不会忽略空格。

void function (...) 
{
    for(std::istreambuf_iterator<char> loop(infile);
        loop != std::istreambuf_iterator<char>();
        ++loop) 
    {
        char ch = *loop; 
        ...
    }
}