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

时间:2012-09-22 17:22:51

标签: c++ fstream bmp file-handling grayscale

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

#include<iostream>
#include<fstream>
#include<conio.h>
#include<stdio.h>
using namespace std;
class pixel{
            public:
                   unsigned char b;
                   unsigned char g;
                   unsigned char r;
            void display()
            {
                 cout<<r<<" "<<g<<" "<<b<<" ";
                 }
      }p1;
using namespace std;
int main(){
    unsigned char avg;
    fstream file("image.bmp",ios::binary|ios::in|ios::out);

    int start;
    file.seekg(10);
    file.read((char*)&start,4);


    file.seekg(start);
    int i=0;
   while(!file.eof()){
                      cout<<file.tellg();//Remove this and the program doesn't work!
                     file.read((char*)&p1,3);
                     avg=(p1.b+p1.g+p1.r)/3;
                     p1.b=avg;
                     p1.g=avg;
                     p1.r=avg;
                     file.seekg(-3,ios::cur);
                     file.write((char*)&p1,3);
                       }
    file.close();
    getch();
    return 0;
}

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

我不明白删除cout语句有什么区别?

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

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

Reading and writing to files simultaneously?

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

1 个答案:

答案 0 :(得分:6)

在读写std::fstream时,在阅读和写作之间切换时需要寻找。原因是文件流共享一个共同的输入和输出位置。为了还支持有效的缓冲,有必要向相应的其他缓冲区通知当前位置。这是寻求所做的一部分。 tellg()寻求当前的位置。

请注意,在读写之间切换是非常低效的,尤其是在实现得到很好的优化时。无论是编写不同的文件还是更新合理大小的组中的值,都会好得多。