如何正确阅读整个istream?

时间:2010-06-09 08:52:31

标签: c++

这是一个在屏幕上打印txt文件的所有字符的简单代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
       int **i;
       int j,k;
       char a;
    ifstream test("test.txt", ios::binary);
    while((a=test.get())!=-1)//if I use "while(!test.eof())" here, how to avoid the output of the last character(-1) to std::cout, or any ostream objects?
    {
   putchar(a);//also change this to putchar(test.get());
    }
       getchar();
}

正如我在代码中所提到的,如果我使用“test.eof()”来判断test.txt的结尾,我将总是在输出的末尾得到一个额外的空白。如何避免呢?

2 个答案:

答案 0 :(得分:1)

你想:

int a;

get()函数返回一个int,而不是一个char - 这在C中是相同的 - 当使用getchar()时,你读入一个int变量而不是char。所以你的循环看起来像:

while( ( a = test.get() ) != EOF )

注意你想要EOF,而不是eof()。使用eof()的版本看起来像这样:

char c;
while( test.get( c ) ) {
   putchar( c );   // or whatever
}

if ( test.eof() ) {
  // Ok, we finished because of end of file
}
else {
  // finished not because of end of file - probably an error
}

答案 1 :(得分:0)

get方法只会在尝试读取EOF后设置eof错误位。这就是为什么你得到while (!test.eof())案件的额外空白。 通常,在检测到发生EOF之前,您必须先阅读EOF。也许你可以这样做:

char c = test.get();
while (!test.eof()) {
    putchar(c);
    c = test.get();
}

或改写为:

for (char c = test.get(); !test.eof(); c = test.get()) {
    putchar(c);
}