2009-03-20 5 views
0

Lors de la lecture d'un fichier binaire en utilisant DJGPP sous DOS ce code se bloque. Cela se produit lorsque l'appel Fread est fait. Si l'appel est supprimé, le programme s'exécute correctement. Le même code fonctionne correctement via Visual C++ 2008. Est-ce que quelqu'un a rencontré des problèmes similaires avec djgpp? Est-ce que je rate quelque chose de vraiment simple?erreur de fread avec 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; 
} 
+0

Le premier argument de fread devrait sûrement être & x et pas seulement x. Il veut un pointeur vers un tampon char, vous lui donnez juste un char. –

+0

Oui, j'ai corrigé ça. Je me fais toujours pendre. – vivekian2

+0

note: vous ne faites pas d'erreur lorsque le fichier n'est pas trouvé (un point de style, en tant que tel) – KevinDTimm

Répondre

2
  • Je ne vois pas ce fp 'est. Je dois juste supposer que c'est 'FILE * fp'.

  • Je ne vois pas que vous incluez effectivement < stdio.h>, et vous devez supposer que vous le faites.

  • Je ne vois pas que vous incluez effectivement < iostream> et déclarez 'using namespace std;', et vous devez supposer que c'est le cas.

  • Je ne vois pas ce qui vient après l'appel de fread() qui pourrait vous dire si l'appel a réussi.

En passant par le processus de réduction réellement votre code défectueux au strict minimum mais complet pour reproduire l'erreur est la première chose que vous devez faire quand un morceau de code est abasourdi.

Il se peut (et il s'avère généralement) que le problème n'est pas là où vous le pensiez.

Cela dit, je vais essayer de remplacer

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

avec

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

En utilisant 'perror() au lieu des messages homebrewn vous Cout donne des informations supplémentaires sur la cause de toute erreur. Utiliser 'fgetc()' vous montrera que le fichier contient réellement ce que vous pensez qu'il fait, et que vos problèmes ne sont pas dus à l'utilisation quelque peu inhabituelle de fread() pour un seul octet.

Puis rapportez.

+0

@DevSolar Le problème est survenu à cause de quelque chose que je faisais beaucoup avant ce code - éteindre certains firmwares, provoquant l'échec de fread(). Votre pointé dans la bonne direction cependant - "le problème n'est même pas là où vous pensiez que c'est." – vivekian2

0

fread prend un pointeur comme premier paramètre. Si vous avez seulement à lire dans un caractère, char x; est bien, mais passez l'adresse de x à la place.

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

et depuis sizeof carbonisation est toujours 1 (par définition), vous pouvez très bien écrire:

fread(&x,1,1,fp) != 1 
+0

fixe qui reçoivent toujours un blocage. – vivekian2

Questions connexes