Проблема в том, что в стандартном ifstream, после чтения до конца файла (eof()), функция seekg работать перестаёт.
Вот простой код, который даёт неравные буферы:
// TestIfstreamSeekg.cpp
#include <fstream>
#include <iostream>
using namespace std;
#define BUFFER_SIZE 10
int main(int argc, char* argv[])
{
ifstream ifs("TestIfStreamSeekg.exe",ios::binary); // любой файл, длиной больше 10 байт, для простоты взят сам exe-шник, формат открытия неважен, может быть и текстовый
// читаем первые байты
char buffer0[BUFFER_SIZE];
ifs.read(buffer0,BUFFER_SIZE);
// доходим до eof()
char temp[1000];
while(!ifs.eof())
{
ifs.read(temp,1000);
}
//ifs.clear(); // а это волшебный финт ушами, который при раскомментировании помогает заставить seekg работать (шаманство подсмотрено на других форумах)
// перемещаемся к началу файла (якобы)
ifs.seekg(0,ios::beg);
// снова читаем первые байты
char buffer1[BUFFER_SIZE];
ifs.read(buffer1,BUFFER_SIZE);
// сравниваем считанные буферы
if(memcmp(buffer0,buffer1,BUFFER_SIZE) != 0)
{
// опа! буферы разные
cout << "buffers are not equal!" << endl;
}
else
{
// всё зашибись!
cout << "buffers are equal" << endl;
}
ifs.close();
return 0;
}
решение проблемы - сброс бита: перед вызовом seekg() вызывать clear(). можно ещё переоткрыть файл - тоже, естественно, сработает.
главное, знать об этом косяке