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é.
InformationsquelleAutor Ryan Webb | 2013-09-10