我有这段代码
#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'?'。
答案 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;
这将允许您查看不可打印的字符。