copie d'un fichier à l'aide du langage c, les appels système
Je suis d'explorer les appels système en langage de programmation c et à essayer quelques exemples sur la copie d'un fichier. Je suis en cours d'exécution dans des questions où j'ai un fichier texte d'origine contenant une seule ligne "The quick brown fox..." à copier et ensuite le résultat contient des données qui ne sont pas destinés à être là. Des idées ou des conseils je devrais savoir sur la façon de résoudre ce problème?
Quand j'ai essayé d'exécuter l'exemple de code ./copie sample.txt new_sample.txt (similaire à cp commande), je reçois cette sortie sur le terminal:
$./copy sample.txt new_sample.txt
argv[0] = ./copy
argv[1] = sample.txt
argv[2] = new_sample.txt
ERROR: couldn't write whole buffer
Segmentation fault: 11
$
étant donné qu'il y a une erreur sur le terminal, il y a un fichier créé sous le nom new_sample.txt l'ouverture à l'aide de vim éditeur révèle ce résultat.
The quick brown fox jumps over the lazy dog.
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@à¾dÿ^?^@^@^@^@¾dÿ^?^@^@<9b>¿¾dÿ^?^@^@Àú½dÿ^?^@^@^_ã¾dÿ^?^@^@@ü½dÿ^?^@^@<90>û½dÿ^?^@^@@û½dÿ^?^@^@^Z^S¾dÿ^?^@^@^@^@^@^@^@^@^@^@^@^@þ^D^A^@^@^@À^E¾dÿ^?^@^@^@^@^@^@ÿ^?^@^@
^G¾dÿ^?^@^@0^G¾dÿ^?^@^@^@^@^@^@^C^@^@^@pû½dÿ^?^@^@×^Eä¦÷[<87>^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
voici un exemple de code que j'ai: (nom de fichier: copie.c)
#include <sys/stat.h>
#include <fcntl.h>
#include "tlpi_hdr.h" /* contains stdlib, sys/types, stdio.h, unistd, error, string.h */
#ifndef BUF_SIZE /* Allow "cc -D" to override definition */
#define BUF_SIZE 1024
#endif
int main(int argc, char *argv[])
{
int inputFd;
int outputFd;
int openFlags;
mode_t filePerms;
ssize_t numRead;
char buf[BUF_SIZE];
/* check for the inputs */
int arg_count=0;
for (arg_count; arg_count < argc; arg_count++)
printf("argv[%d] = %s\n", arg_count, argv[arg_count]);
if (argc != 3 || strcmp(argv[1], "--help") == 0)
usageErr("%s old-file new-file\n", argv[0]);
/* open input and outpu files */
inputFd = open(argv[1], O_RDONLY);
if (inputFd == -1)
errExit("opening file %s", argv);
openFlags = O_CREAT | O_WRONLY | O_TRUNC;
filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; /*rw-rw-rw*/
outputFd = open(argv[2], openFlags, filePerms);
if (outputFd == -1)
errExit("opening file %s", argv[2]);
/* transfer data until we encounter end of input or an error */
while ((numRead = read(inputFd, buf, BUF_SIZE)) > 0)
{
if (write(outputFd, buf, BUF_SIZE) != numRead)
fatal("couldn't write whole buffer");
}
if (numRead == -1)
errExit("read");
if (close(inputFd) == -1)
errExit("close input");
if (close(outputFd) == -1)
errExit("close output");
exit(EXIT_SUCCESS);
}
- Si sur Linux vous aussi vous aimeriez avoir regarder les
sendfile()
appel système. - Grâce alk - noté.
Vous devez vous connecter pour publier un commentaire.
Votre boucle lit trop à la fin du fichier car le fichier ne peut pas être un multiple de
BUF_SIZE
dans la longueur. Donc, si vous avez 20 octets dans votre fichier, vous aurez l'original 20 octets copiés, plus 1004 octets de cochonneries (quoi que dans votre mémoire tampon).Faire pour écrire le nombre d'octets que vous lisez à la sortie: