[C]Mémoire optimale à allouer pour une copie de... - ...fichiers binaires

Bonjour.

  1. Je souhaiterai connaitre la valeur optimale de mémoire à allouer pour une copie de fichiers binaires.
  2. De quel type doit être le pointeur qui reçoit la première adresse mémoire de l’allocation?

J’ai codé:


#define NOMBRE_BLOCS 1024*32  /* valeur optimale? */
...
int longueur;
int *zone_allouee = malloc(NOMBRE_BLOCS); /* int? */
...
        while((longueur = fread(zone_allouee, 1, NOMBRE_BLOCS, fichier_source)) != 0);
        {
            fwrite(zone_allouee,1,longueur,fichier_copie);
        }

Toute aide est la bienvenue.

Tout d’abord, la définition doit plutôt s’écrire : #define NOMBRE_BLOCS (1024*32) ==> les défitions du préprocesseur sont recopiées textuellement, les parenthèses sont là pour éviter les effets de bords.

Ensuite, inutile de faire un malloc : NOMBRE_BLOCS n’est pas une variable, mais une constante du préprocesseur : la vraie valeur remplacera NOMBRE_BLOCS AVANT la compilation du code.

Par ailleurs, tu copies des caratères, donc le pointeur est de type char *. Mais bon, ton code aurait fonctionné de même, il aurait juste alloué un bloc quatre ('fin, ça dépend de l’architecture) fois plus gros que nécessaire.

Voilà le code corrigé :

#define NOMBRE_BLOCS (1024*32)  /* valeur optimale? */
...
int longueur;
char buffer[NOMBRE_BLOCS];
...
       while((longueur = fread(buffer, sizeof (char), NOMBRE_BLOCS, fichier_source)) != 0);
       {
           fwrite(buffer, sizeof (char), longueur, fichier_copie);
       }

EDIT : cette fois c’est bon, après quatre edits :ane:

EDIT 2: fatigué aujourd’hui… oublié de répondre à la question de départ… Mais bon, de toute façon je sais pas :confused: Tu peux tester plusieurs valeurs et voir combien de temps ça prend pour chacune d’elles.

merci

L’idéal est selon moi de mallocer sizeof(binary_file) avec un coup de fseek à la fin du fichier + ftell + fseek début du fichier pour connaitre la taille dudit fichier.
Il faut bien évidemment prendre en compte la taille du fichier et éviter d’utiliser cette méthode pour un divx par exemple.

Bonne idée :).
Je te remercie.