2010-01-05 13 views
11

Quiero volver a escribir el comando "cp" de Linux. Entonces, este programa funcionará como #./a.out originalfile copiedfile. Puedo abrir el archivo, crear un nuevo archivo pero no puedo escribir el nuevo archivo. Nada está escrito. ¿Cuál podría ser la razón?¿Cómo escribir un archivo con C en Linux?

El código C actual es:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main(int argc,char *aa[]){ 
    int fd,fd1; 
    char buffer[100]; 

    if(argc!=3){ 
     printf("Usage : ./a.out <original> <copy> \n"); 
     return -1; 
    } 

    fd=open(aa[1],O_RDONLY,S_IRUSR); 
    if(fd==-1){ 
     printf("file not found.\n"); 
     return -1; 
    } 
    fd1=open(aa[2],O_CREAT | O_WRONLY,S_IRUSR); 
    if(fd1!=-1){ 
     printf("file is created.\n"); 
    } 
    ssize_t n; 
    while(n=read(fd,buffer,50)){ 
     write(fd1,buffer,n); 
     printf("..writing..\n"); 
    } 
    close(fd); 
    close(fd1); 
} 
+1

Variable no utilizada fd2; no olvides comprobar que escribir escribe todo lo que esperabas; no use asignaciones como condiciones (use GCC -Wall); aún es mejor devolver un valor desde main() aunque C99 (erróneamente) le permite dejar el retorno de main(). Su mensaje de error para fd1 es incorrecto; no sale cuando falla en fd1. Puede usar sizeof (buffer) en la lectura en lugar de 50, que es la mitad del tamaño de su buffer. Los errores se escriben clásicamente en stderr, no en stdout. Su ciclo se encuentra con problemas si la lectura falla (valor negativo) en lugar de no devolver nada. –

+0

Acabo de copiar y pegar el código en mi máquina, compilado con gcc y funciona bien. – Dipstick

+0

Oh, algo milagro sucedió.Debido a su comentario, intenté mover el archivo a otro lugar y volví a probarlo. ¡¡¡Funciona!!! Muchas gracias. – Devyn

Respuesta

12

tiene que escribir() read() de datos en el nuevo archivo:

ssize_t nrd; 
int fd; 
int fd1; 

fd = open(aa[1], O_RDONLY); 
fd1 = open(aa[2], O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); 
while (nrd = read(fd,buffer,50)) { 
    write(fd1,buffer,nrd); 
} 

close(fd); 
close(fd1); 

Actualización: Añadido abre el correcto ...

Por cierto, el O_CREAT puede usando OR (O_CREAT | O_WRONLY). En realidad, estás abriendo demasiados identificadores de archivo. Solo haz la apertura una vez.

+0

Hola, gracias por la respuesta. Edité mi publicación con un nuevo código. Intenté como dijiste, pero aún no funcionaba. Nada está escrito en un nuevo archivo. ¡Por favor, ayúdame! – Devyn

+0

Actualicé mi publicación, espero que sea un poco mejor ... – dlamotte

+0

Lo siento pero aún no funciona. Puse una cuerda dentro del ciclo while y mostró que while loop funcionaba solo una vez. :( – Devyn

2

que tiene que hacer write en el mismo bucle que read.

7

En primer lugar, el código que escribió no es portátil, incluso si lo hace funcionar. ¿Por qué utilizar funciones específicas del sistema operativo cuando existe una forma de hacerlo perfectamente independiente de la plataforma? Aquí hay una versión que usa solo un archivo de encabezado y es portátil para cualquier plataforma que implemente la biblioteca estándar de C.

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    FILE* sourceFile; 
    FILE* destFile; 
    char buf[50]; 
    int numBytes; 

    if(argc!=3) 
    { 
     printf("Usage: fcopy source destination\n"); 
     return 1; 
    } 

    sourceFile = fopen(argv[1], "rb"); 
    destFile = fopen(argv[2], "wb"); 

    if(sourceFile==NULL) 
    { 
     printf("Could not open source file\n"); 
     return 2; 
    } 
    if(destFile==NULL) 
    { 
     printf("Could not open destination file\n"); 
     return 3; 
    } 

    while(numBytes=fread(buf, 1, 50, sourceFile)) 
    { 
     fwrite(buf, 1, numBytes, destFile); 
    } 

    fclose(sourceFile); 
    fclose(destFile); 

    return 0; 
} 

EDIT: El glibc reference tiene esto que decir:

En general, usted debe pegarse con utilizando corrientes en lugar de presentar descriptores, a menos que haya alguna operación específica que desea hacer eso solo se puede hacer en un descriptor de archivo. Si usted es un programador de inicio y no está seguro de cuáles son las funciones que debe utilizar, sugerimos que se concentre en los funciones de entrada formateados (ver de entrada con formato) y el formato de salida funciones (véase la salida con formato).

Si usted está preocupado acerca de la portabilidad de sus programas a sistemas distintos GNU, también se debe tener en cuenta que descriptores de archivos no son tan portátil como corrientes . Usted puede esperar cualquier sistema correr ISO C para soportar corrientes, pero sistemas no GNU no sea compatible con archivos descriptores en absoluto, o sólo se puede aplicar un subconjunto de GNU funciones que operan en el archivo descriptores. La mayoría de las funciones del descriptor de archivo en la biblioteca GNU están incluidas en el estándar POSIX.1 , sin embargo.

+0

Me interesaría la alimentación Volviendo sobre por qué exactamente me votaron en este ... –

+0

Creo que haces un buen punto sobre el uso de transmisiones ... (No te voté), pero te devolveré a cero. – dlamotte

+0

El voto en voz baja en sí no me molesta en absoluto, es el _por qué_ me interesa. La retroalimentación, ya sea positiva o negativa, me ayuda a mejorar. Si puedo hacer eso mientras (con suerte) ayudo a alguien más al mismo tiempo, nada igual. –

Cuestiones relacionadas