2016-10-04 3 views
0

J'utilise MinGW dans Windows 8.1 et j'ai un fichier texte d'entrée de nombres bruts (un par ligne) et je veux les écrire comme binaire dans un nouveau fichier binaire. L'exemple compile sans problème avec:fread ou fwrite donne "numéro de fichier incorrect"

gcc -pedantic -Os -c my_code.c -o my_code.exe 

mais la sortie est

$ my_code.exe 
sh: ./my_code.exe: Bad file number 

Voici le code que j'ai écrit:

#include<stdio.h> 

int main() 
{ 
    FILE *fp; 
    FILE *prob; 
    int length; 
    char buffer[30]; 

    // Open file containing numbers 
    if ((prob = fopen("raw_numbers.txt","r")) == NULL) 
    { 
     printf("Could not open raw_numbers.txt\n"); 
     exit(1); 
    } 

    /* Create output binary file */ 
    fp = fopen("file.bin" , "w"); 

    while(! feof(prob)) 
    { 
     fgets(buffer, sizeof(buffer), prob); 
     fwrite((const void*) & buffer, 1, sizeof(buffer), fp); 
    } 

    fclose(prob); 
    fclose(fp); 
    return(0); 
} 

En utilisant

$ gcc --version 
gcc (GCC) 3.4.4 (msys special) 
+3

Je pense que vous êtes censé passer 'buffer', au lieu de' & buffer' à fwrite. – squirem

+0

Toujours le numéro de fichier Bad persiste sans le & – Veronica

+2

Vous devez vérifier si le fichier 'file.bin' a été réellement ouvert. – DaBler

Répondre

4

Vous avez multiple erro rs dans votre programme:

  • Vous devez tester l'échec de la création du fichier de sortie.

  • vous devez tester la valeur de retour de fgets() au lieu d'utiliser while (!feof())..., qui ne fait pas ce que vous pensez comme expliqué dans Why is “while (!feof (file))” always wrong?

  • vous devriez passer buffer-fwrite au lieu de &buffer

  • vous devriez passez le nombre d'octets à écrire (strlen(buffer)) au lieu de la taille du tampon.

  • Vous dites que le fichier de sortie doit être binaire, mais vous l'ouvrez en tant que fichier texte et y écrivez du texte. Vouliez-vous convertir les nombres en binaire et écrire la représentation binaire?

Voici une alternative qui met en œuvre ce qui précède:

#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    FILE *fp; 
    FILE *prob; 
    int value; 
    char buffer[30]; 

    /* Open file containing numbers */ 
    if ((prob = fopen("raw_numbers.txt", "r")) == NULL) { 
     printf("Could not open raw_numbers.txt: %s\n", strerror(errno)); 
     exit(1); 
    } 

    /* Create output binary file */ 
    if ((fp = fopen("file.bin", "wb")) == NULL) { 
     printf("Could not open file.bin: %s\n", strerror(errno)); 
     exit(1); 
    } 

    while (fgets(buffer, sizeof(buffer), prob) != NULL) { 
     value = atoi(buffer); 
     if (fwrite(&value, sizeof(value), 1, fp) != 1) { 
      printf("Error writing to file.bin: %s\n", strerror(errno)); 
      exit(1); 
     } 
    } 

    fclose(prob); 
    fclose(fp); 
    return 0; 
} 

La coquille de diagnostic est trompeur, mais voici ce que cela signifie: le fichier my_code.exe a une signature (également connu sous le nombre magique) que n'est pas reconnu comme un fichier exécutable. Le noyau ne peut pas déterminer comment exécuter le fichier à partir de son numéro magique, par conséquent Numéro de fichier incorrect.

La raison est votre commande de compilation: gcc -pedantic -Os -c my_code.c -o my_code.exe compile le fichier source my_code.c au format d'objet au lieu de lier directement au format exécutable. Supprimez l'option -c pour compiler et lier en une seule étape:

gcc -pedantic -Os my_code.c -o my_code.exe 
+0

"Avez-vous voulu convertir les nombres en binaire et écrire la représentation binaire?" Oui!! C'est exactement ce que je veux. Mais votre code renvoie également un mauvais numéro de fichier à l'exécution. – Veronica

+0

@Veronica: voir ma réponse mise à jour sur le mystérieux message d'erreur shell ... celui-ci était délicat! – chqrlie