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.
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é. –
@ Michael Burr J'aimerais vraiment que vous ayez plus d'informations à ce sujet. – cnicutar
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. –