为什么调用istream::tellg()会影响我的程序行为?

14 浏览
0 Comments

为什么调用istream::tellg()会影响我的程序行为?

我正在尝试将一个24位位图图像转换为灰度图。

#include
#include
#include
#include
using namespace std;
class pixel{
public:
    unsigned char b;
    unsigned char g;
    unsigned char r;
    void display()
    {
        cout<

当我移除cout tellg语句时,循环只运行两次!

我不明白移除一个cout语句会有什么不同?

结果:只有一个像素变为灰度。

我在这里找到了一个简化版本的问题

同时读写文件?

但没有找到解决方法...

0
0 Comments

调用 istream::tellg() 函数会影响程序的行为,出现这个问题的原因是因为文件流共享一个输入和输出位置,为了支持有效的缓冲,需要通知其他缓冲区当前的位置。这也是 seek 的一部分,tellg() 函数会执行一个 seek 到当前位置。

需要注意的是,在读写之间频繁切换是非常低效的,特别是当实现已经优化过的情况下。更好的解决方法是要么写入一个不同的文件,要么以合理的组为单位更新值。

特别荒谬的是在一个循环中调用 seekg(-3) 来遍历所有像素!

这是标准规定的吗?我在不同的平台上看到了不同的行为。

实际上,无论是 C 还是 C++ 文件 I/O,在从读取切换到写入或者从写入切换到读取时都需要进行 seek。具体要求在 C 标准中有规定,C++ 流的行为是依据 C 的要求定义的。在实现缓冲 I/O 并且试图让其高效的情况下,需要进行 seek 的需求变得非常明显:在不进行 seek 的情况下支持读写切换(至少在我实现 filebuf 的时候是如此)会有很大的代价。

谢谢你的解答,让我更加清楚了。

0