2016-05-17 91 views
1

我有一个函数,应该通过字符读取文件字符并输出到控制台,直到它到达EOF。该功能可以很好地显示我想要的所有角色,但它只是继续前进,并且从不停止。EOF功能故障

下面是功能

void displayAllLines(ifstream &joke) 
{ 
    char ch; 
    joke.clear(); 
    ch = joke.get(); 
    while (ch != EOF) 
    { 
     cout << ch; 
     ch = joke.get(); 
    } 
} 

文件内容如下

“(空行) 问:什么做的舌头说牙齿?”

正如我所说,它显示的行很好,但循环继续问号后。

任何想法,为什么这可能是?此外,是否需要更多信息来正确回答我的问题?

回答

1

这样做的典型方式是:直到遇到EOF

void displayAllLines(ifstream &joke) 
{ 
    char ch; 
    while (true) 
    { 
     ch = joke.get(); 
     if (joke) { 
      cout << ch; 
     } else { 
      break; 
     } 
    } 
} 

表达joke将评估为true。我不知道为什么你想先拨打joke.clear()

+1

这只是我从一个文件开始时就教过的习惯。只要确保一开始就没有标志。你认为这是毫无意义的,或者你认为这对程序可能有害? 编辑::至于你发布的代码,它肯定会进一步推进该程序,但不占空间字符,并显示一切没有空间 – Podo

+0

另外,好奇,如果你有任何想法,为什么我的代码*不*工作。 – Podo

+0

我不认为你应该盲目地调用clear()''。如果有标志设置,那么这将是一个原因,只是清除它们将无济于事。您的代码不起作用,因为C++流不像C那样将EOF读为字符。 C++流读取字符,直到它们碰到EOF。 (他们从来没有真正返回EOF字符 - 这是一个C的东西。) – Phil

1

@Phil回答“如何在C++中做到这一点”。我的答案是“为什么会发生这种情况”和“如何在C中执行此操作”(它仍然以C++工作)。


由于ASCII表去一路从1,我们有串端接(说话C和C++语言)保留字节值0('\0'的EOF必须之外的特殊值的。

这就是为什么getchar()ifstream::get()返回int,而不是char。因此,所有你需要做的是改变

char ch; 

int ch; 

,并投它为char印刷:

cout << (char) ch; 

技术上,EOF通常是-1。您的char可能有0 - 255,这意味着它永远不会等于-1。一个体面的编译器-Wall启用应该给你至少一个警告,但。

+0

更一般地说,而不是'int'使用'std :: istream :: traits_type :: int_type'。这适用于所有字符编码,而不仅仅是ASCII。 –