为什么调用的IStream ::所以tellg()影响我的程序的行为?(Why does calli

2019-09-22 19:08发布

我想一个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声明做什么呢?

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

我发现我的问题的一个简化版本在这里

同时读取和写入文件?

但是没有找到一个解决方案...

Answer 1:

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

请注意,这是非常低效的阅读和写作之间切换,特别是当实现很好的优化。 你会关闭或者写一个不同的文件或者在合理的大小组更新值好得多。



文章来源: Why does calling istream::tellg() affect the behavior of my program?