为什么 rdbuf() 不打印任何东西?

Why does rdbuf() not print anything?

在下面的例子中,

ifstream myFile;
myFile.open("example.txt", ios::binary);
cout << myFile.rdbuf() << endl; 
myFile.close();

文件的内容将全部打印在一行中。你也可以这样做:

ifstream myFile;
myFile.open("example.txt", ios::binary);    
unsigned char character = myFile.get();
while(myFile){
    cout << "one character = ";
    cout << character;
    character = myFile.get(); //gets each individual character, 1 at a time
}
myFile.close();

它会打印文件的内容,一次一个字符。但是,如果您尝试一个接一个地执行这些方法(以任何顺序),实际上只有一种方法会打印任何内容。有人可以解释为什么在下面的示例中,对 rdbuf() 的调用不会打印文件的内容吗?

ifstream myFile;
myFile.open("example.txt", ios::binary);    
unsigned char character = myFile.get();
while(myFile){
    cout << "one character = ";
    cout << character;
    character = myFile.get(); //gets each individual character, 1 at a time
}
cout << myFile.rdbuf() << endl; 
myFile.close();     

谢谢!

当您从流中读入时,读取位置会递增。一个字符一个字符地读入整个文件后,读取的位置是文件的末尾。在这种情况下,rdbuf()(读取缓冲区)没有任何其他意义。

如果您想使用 rdbuf() 再次打印文件,您可以在尝试打印之前使用 myFile.seekg(0, std::ios::beg); 设置读取位置。在此特定示例中,可能已经设置了错误位,因此您可能需要在移动读取指针之前执行 myFile.clear()