фред ошибка с DJGPP - PullRequest
       51

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

0 голосов
/ 20 марта 2009

При чтении двоичного файла с помощью 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 ]

2 голосов
/ 23 марта 2009
  • Я не вижу, что такое 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 ()» вместо сообщений «homebrewn cout» дает дополнительную информацию о причине любой ошибки. Использование 'fgetc ()' покажет вам, что файл действительно содержит то, что вы думаете, и что ваши проблемы не связаны с несколько необычным использованием fread () для одного байта.

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

0 голосов
/ 20 марта 2009

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

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

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

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