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

C++ 为什么调用istream::tellg()会影响程序的行为?,c++,fstream,bmp,file-handling,grayscale,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;

我正在尝试将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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
类像素{
公众:
无符号字符b;
无符号字符g;
无符号字符r;
无效显示()
{

cout读取和写入
std::fstream
时,在读取和写入之间切换时需要搜索。原因是文件流共享一个公共输入和输出位置。为了支持高效缓冲,有必要将当前位置通知相应的其他缓冲区。这是see的一部分k执行。
tellg()
搜索当前位置


请注意,在读和写之间切换是非常低效的,尤其是在实现得到良好优化的情况下。您最好编写不同的文件或在大小合理的组中更新值。

请记住,人类不善于看到光谱的蓝端。因此需要修改关于这一点,请参阅颜色问题。但是,这对解决当前的问题没有帮助。我总是担心从与我刚才编写的流相同的文件中读取。我会尝试读取所有像素,处理它们,然后全部写入。我也不知道为什么它只运行两次。这会占用大量内存…接近3-4 mb.bmp文件已经太大了…如果你一个接一个地处理每个像素,只需要几个字节…特别荒谬的是seekg(-3)在所有像素的循环中,这个标准是强制的吗?@ LexNeasraceSin轨道:C和C++文件I/O都需要从读到写或反之亦然的搜索:实际需求是在C标准中。C++流行为是根据C要求定义的。客户端对查找的需求变得相当明显:支持在不进行查找的情况下在读写之间切换(至少,在我实现
filebuf
时)是一项巨大的成本(对于那些没有在输入和输出之间切换的使用)。@DietmarKühl:感谢您的澄清