C ++ ifstream类的get()方法返回字符?

时间:2015-04-08 16:43:26

标签: c++ get ifstream

我有这段代码

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char **argv) {
    ifstream in;
    in.open(*(argv+1));
    char c;

    while (true) {
        if (in.eof())
            break;
        c = in.get();
        cout << c;
    }
    in.close();

    return 0;
}

我读取了通过命令行传递的文件作为第一个参数。 在阅读文件时,我得到了char'?'作为最后一个。为什么呢?

如果我删除此行

in.open(*(argv+1));

我只会得到char'?'。

2 个答案:

答案 0 :(得分:6)

while循环中,您最终阅读eof

c = in.get(); // reads eof
cout << c;

这不是阅读文本文件的最佳方式,请使用

while(in >> c){ // process c here }

while(in >> std::noskipws >> c) { // process c here } 

如果你想要包含空格(如\n)。

如果您的文件是二进制文件,那么显示文件并没有多大意义,但如果您愿意,请使用get()但在进一步处理之前测试if(!in) break;

c = in.get();
if (!in) // test the stream
    break;
cout << c; // then process

如果您只想显示文件,最简单的方法是直接使用流缓冲区,例如

std::cout << in.rdbuf(); // display the whole file at once

相关:Why is iostream::eof inside a loop condition considered wrong?

答案 1 :(得分:1)

istream::get()方法从输入流返回未翻译的值。

如果该值不可打印,您的控制台可能会将该字符翻译为&#39;?&#39;。

更好的方法是打印字符的值以及字符:

cout << "\'" << c << "\', 0x" << hex << ((unsigned int) c) << endl;

这将允许您查看不可打印的字符。