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

x8goxv8g  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(186)

我有这个密码

#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;
}

我读取了通过命令行传递的文件作为第一个参数。在阅读文件时,我得到了字符'?'作为最后一个参数。为什么?
如果我去掉这条线

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

我只会得到一个字符'?'。

isr3a4wc

isr3a4wc1#

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) break; // test the stream
cout << c;      // then process

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

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

相关:Why is iostream::eof inside a loop condition (i.e. while (!stream.eof())) considered wrong?

wfsdck30

wfsdck302#

istream::get()方法从输入流返回一个 untranslated 值。
如果该值不可打印,您的控制台可能会将该字符转换为“?”。
更好的方法是将字符的值与字符沿着打印:

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

这将允许您看到无法打印的字符。

相关问题