Почему вызов istream::tellg() влияет на поведение моей программы?

Я пытаюсь преобразовать 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?

Результат: только один пиксель изменяется в оттенках серого.

Я нашел более простую версию моей проблемы здесь

Чтение и запись в файлы одновременно?

Но не нашел решения...

1 ответ

Решение

При чтении и написании std::fstream вам нужно искать при переключении между чтением и письмом. Причина этого в том, что файловые потоки имеют общую позицию ввода и вывода. Чтобы также поддерживать эффективную буферизацию, необходимо информировать соответствующий другой буфер о текущей позиции. Это часть того, что делает поиск. tellg() ищет текущую позицию.

Обратите внимание, что переключение между чтением и записью очень неэффективно, особенно когда реализация хорошо оптимизирована. Вам было бы гораздо лучше либо написать другой файл, либо обновить значения в группах разумного размера.

Другие вопросы по тегам