Фред ошибка с DJGPP

При чтении двоичного файла с использованием DJGPP в DOS этот код зависает. Это происходит, когда сделан вызов фреда. Если вызов удален, то программа запускается успешно. Тот же код отлично работает в Visual C++ 2008. Кто-нибудь испытывал подобные проблемы с djgpp? Я упускаю что-то действительно простое?

char x; 
string Filename = "my.bin" ; 
fp = fopen(Filename.c_str(),"rb"); 

if (fp == NULL)
{
    cout << "File not found" << endl ; 
}

if (fseek (fp, 0, SEEK_END) != 0)
{
    cout <<"End of File can't be seeked"; 
    return -1; 
}

if ( (fileLength = ftell(fp)) == -1)
{
    cout <<"Can't read current position of file"; 
    return -1; 
}

if (fseek (fp, 0, SEEK_SET) != 0)
{
    cout <<"Beginning of File can't be seeked"; 
    return -1; 
} 

if (fread(&x,sizeof(x),1,fp) != sizeof(x))
{
    cout <<"file not read correctly"; 
    return -1; 
}

2 ответа

Решение
  • Я не вижу, что такое fp. Я просто должен предположить, что это 'FILE * fp;'.

  • Я не вижу, что вы на самом деле включаете , и должны предполагать, что вы это делаете.

  • Я не вижу, что вы на самом деле включаете и объявляете 'using namespace std;', и должны предполагать, что вы это делаете.

  • Я не вижу, что происходит после вызова fread(), который может сказать вам, если вызов был успешным.

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

Может (и обычно так и получается) проблема не в том, о чем вы думали.

При этом я бы попробовал заменить

if (fread(&x,sizeof(x),1,fp) != sizeof(x))
{
    cout <<"file not read correctly"; 
    return -1; 
}

с

int i;
if ( ( i = fgetc( fp ) ) == EOF )
{
    perror( "File not read correctly" );
    return -1;
}
x = (char) i;
cout << "Success, read '" << x << "'." << endl;

Использование perror() вместо доморощенных сообщений cout дает дополнительную информацию о причине любой ошибки. Использование 'fgetc()' покажет вам, что файл на самом деле содержит то, что вы думаете, что он делает, и что ваши проблемы не связаны с несколько необычным использованием fread() для одного байта.

Тогда доложите.

fread принимает указатель в качестве первого параметра. Если вам нужно прочитать только один символ, char x; хорошо, но вместо этого передайте адрес x.

fread(&x,sizeof(x),1,fp) != sizeof(x)

и поскольку sizeof char всегда равен 1 (по определению), вы можете написать:

fread(&x,1,1,fp) != 1
Другие вопросы по тегам