2011-07-05 2 views
2

J'ai écrit un programme qui lit un fichier binaire, traite certains de ses contenus et écrit les résultats dans un fichier différent. Sous Linux, cela fonctionne parfaitement, mais dans Windows cela ne fonctionne pas; les fichiers de sortie sont toujours ... 1 KoSortie binaire sous Windows

Ceci est une version simplifiée du programme:

#include <stdio.h> 

void copyFile(char* source, char* dest); 

int main (int argc, char* argv[]) 
{ 
    if (argc != 3) 
     printf ("usage: %s <source> <destination>", argv[0]); 
    else 
    { 
     copyFile(argv[1], argv[2]); 
    } 
} 


void encryptFile(char* source, char* destination) 
{ 
    FILE *sourceFile; 
    FILE *destinationFile; 

    int fileSize; 

    sourceFile = fopen(source, "r"); 
    destinationFile = fopen(destination, "w"); 

    if (sourceFile == 0) 
    { 
     printf ("Could not open source file\n"); 
     return; 
    } 

    if (destinationFile == 0) 
    { 
     printf ("Could not open destination file\n"); 
     return; 
    } 

    // Get file size 
    fseek(sourceFile, 0, SEEK_END); // Seek to the end of the file 
    if (ftell(sourceFile) < 4) 
     return; // Return if the file is less than 4 bytes 
    fseek(sourceFile, 0, SEEK_SET); // Seek back to the beginning 

    fseek(sourceFile, 0, SEEK_SET); // Seek back to the beginning 

    int currentChar; 

    while ((currentChar = fgetc(sourceFile)) != EOF) 
    { 
      fputc(currentChar, destinationFile); 
    } 

    fclose(sourceFile); 
    fclose(destinationFile); 
} 

J'aimerais vous donner plus de détails sur le problème, mais je n'ai pas beaucoup d'expérience de programmation C dans Windows et je ne sais vraiment pas où peut être le problème.

Répondre

7

Vous devez utiliser le drapeau b à fopen:

fopen(source, "rb") 
fopen(destination, "wb"); 

Je comprends qu'en raison de certains ( cerveau dégâts ) les décisions subjectives, sur win32 atteindre 0x1A sur le flux d'entrée déclenche une EOF si le fichier n'est pas ouvert en "mode binaire".

EDIT

En n'a jamais regardé en elle, mais quelqu'un me dit maintenant que 0x1A a été utilisé dans le DOS comme EOF doux.

+0

Il est probablement plus de dégâts du cerveau alors subjective - la raison du caractère EOF est dû à la connexion préhistorique de Windows avec CP/M qui ne gardé la trace de la taille d'un fichier à un secteur (ou cluster?) granularité. –

+2

@ Michael Burr J'aimerais vraiment que vous ayez plus d'informations à ce sujet. – cnicutar

+0

Il n'y a pas beaucoup plus d'informations - CP/M savait seulement combien de secteurs un fichier texte occupait sur le disque; pour savoir quand il devrait arrêter de lire les données du dernier secteur, une valeur EOF sentinelle a été utilisée, et ils ont choisi 'ctrl-Z' pour être cette sentinelle. Depuis MS-DOS fourni un certain niveau de compatibilité avec CP/M, il a soutenu le même schéma. Et puisque Windows a tiré beaucoup de bagages DOS, nous y sommes. –

1

Vous devez utiliser "rb" et "wb" avec fopen.

3

Eh bien, vous n'ouvrez pas les fichiers en mode binaire (utilisez "wb" et "rb"). Cela n'a pas d'importance sur Linux, mais sur Windows, qui va transformer certains octets lors de la lecture/écriture d'un fichier en mode texte. Par exemple:

\r\n <--> \n 

\x1a (Ctrl-Z) is treated as an EOF indicator