В твоем коде есть некоторый недочет.
Дело в том, что для потоков вызов методов good(), bad() и fail() имеет смысл только после вызова операций, меняющих состояние класса потока. Например, read, write, operator>>, operator<< - меняют его состояние. Поэтому твой код надо модифицировать так, чтобы вызов good() происходил каждый раз после вызова read(). Например, так:
while(!in.eof())
{
in.read(str,w/8);
if (!in.good())
continue; // или break
str_int=(unsigned int*)str;
A=*str_int;
in.read(str,w/8);
if (!in.good())
continue;
str_int=(unsigned int*)str;
B=*str_int;
in.read(str,w/8);
if (!in.good())
continue;
str_int=(unsigned int*)str;
C=*str_int;
in.read(str,w/8);
if (!in.good())
continue;
str_int=(unsigned int*)str;
D=*str_int;
cout <<A<<"|"<<B<<"|"<<C<<"|"<<D<<"\n" ;
}
То есть мы проверяем, корректно ли прошла операция считывания из файла. В нашем случае, операция read может пройти некорректно, когда достигнут конец файла.
tellg возращает -1, почему-то. Я уже задолбался р=пальцем в небо тыкать, такое ущущение, что это я туплю в какой-нибудь мелоче.
То, что tellg возвращает -1 говорит только об одном: класс потока вошел в состояние fail. Это ты можешь проверить, вызвав in.fail() - должен вернуть true. Так как поток находится в состоянии fail, то seekg тоже не будет работать. Об этом написано в документации.
В данном примере может быть только одна причина такого поведения потока - достигнут конец файла и failbit установлен в 1.
Очистить состояние класса потока от ошибок можно с помощью метода clear().
in.clear();
in.seekg(0,ios::beg);
cout <<in.tellg();
Если in.fail() возвращает false, то seekg и tellg будут работать. То есть, если конец файла не достигнут - clear() можно не вызывать.