C++ 为什么调用istream::tellg()会影响程序的行为?
我正在尝试将24位位图图像转换为灰度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;
#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:感谢您的澄清