Forum Clubic

[résolu] [C/C++] La commande copy existe-t-elle?

Bonjour,

J’aurais besoin de copier sans passer par la commande system(); mais je ne sais pas comment faire. J’avais déjà entendu parler d’une commande copy, je l’ai essayée mais ça ne marche pas. Quelqu’un peut-il m’aider ? :??:

memcpy? (c’est du bas-niveau)

deltree>
copy = copie de fichier sous win…
memcpy= copie de zone mémoire

Nesquik69> copier un fichier, c’est simplement lire le contenu de l’un, et l’écrire dans un autre…

avec des iostream c’est très rapidement fonctionnel.

yawhol!

Mais j’ai un problème. Imaginons que je veuille copier un fichier de… 40 Mo, comment faire? Parce que c’est bien gentil de me dire que ça revient à copier le contenu d’un fichier dans un autre mais comment faire? Je sais déjà modifier les fichiers donc si je veux je copier un fichier de quelques lignes je sais le faire, mais copier un fichier de 40 ou 80 Mo ou même 3 Go, je sais pas comment faire.

pseudo code :

ouverture fichier en lecture
ouverture fichier en ecriture
allocation buffer lecture
tant que pas eof de lecture
lecture du fichier dans le buffer de lecture
ecriture du fichier depuis le buffer de lecture
fin tant que
déallocation du buffer de lecture
fermeture fichier ecriture
fermeture fichier lecture

genre :

FILE* in = fopen(fin, "r");
if ( in == NULL ) return; 
FILE* out = fopen(fout, "w");
if ( out == NULL ) {fclose(in); return; }
int c;
while ( (c = fgetc(in)) != EOF ) {
  fputc(out, c);
}
fclose(in);
fclose(out);

Hop…

(bon je sais pas si les fonctions sont bien écrites, et le faire par bloc serait mieux, là ça "utilise" les blocs de la stdlib)

Le problème c’est que le code de Sans-Nom copie octet par octet, donc assez long (si gros fichiers)

En C++ avec les flots c’est pas trop mal:


ifstream src("fichier_source",ios::binary);
ofstream dst("fichier_destination"),ios::binary);

dst<<src.rdbuf();

src.close();
dst.close();

Normalement ce code te fais une ecriture bufferisée (donc + rapide)

Ensuite le rdbuf() doit surement lancer des exceptions (plus de place disque…) donc pense au try/catch

popolof> non, du tout. Les e/s standards sont par défaut bufferisées. (normalement, si j’ai bon souvenir)

[edit] ceci dit ça se remplace facilement par fread + fwrite…

Bon ok merci tout le monde :jap: je vais regarder ça maintenant