ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu

Iniciado por antoniosan20, 9 Agosto 2016, 07:12 AM

0 Miembros y 1 Visitante están viendo este tema.

antoniosan20

hola, me pueden ayudar hacer un programa en C que haga lo mismo que hace el comando cp en ubuntu, tiene que copiar ya sea una cancion o un archivo de texto. ayuda por favor...!

tincopasan

te faltó aclarar para que S.O y si tiene que recibir la misma cantidad de parámetros.

AlbertoBSD

El sistema me imagino es independiente.

Y tambien supongo que con solo 2 parametros son suficientes.

Voy a dejar aqui un bosquejo del código en C, funciona para cualquier sistema, estoy en el movil ahora y puede tener errores.

#include<stdio.h>
#include<stdlib.h>

char buffer[256];

int main(int argc, char **argv){
FILE *origen = NULL;
FILE *destino = NULL;
size_t leido;
if(argc < 3){
exit(0);
}
origen = fopen(argv[1],"rb");
destino = fopen(argv[2],"wb");
while(!feof(origen)){
leido = fread(buffer,1,256,origen);
fwrite(buffer,1,leido,destino);
}
fclose(origen);
fclose(destino);
return 0;
}


saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

class_OpenGL

La mayoría de dispositivos trabaja con bloques de 512 bytes, ¿no sería mejor usar un búfer de 512 bytes? También podrías parametrizar el tamaño del búfer y hacer un malloc, como el comando dd.

Otra cosilla, aunque este programa en la mayoría de casos funcione sin inconvenientes, hay algunos casos en los que fallará. Creo que esta sería la solución:

while(!feof(origen)){
leido = fread(buffer,1,256,origen);
if(0 < leido)
fwrite(buffer,1,leido,destino);
}

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

AlbertoBSD

Si claro hay muchos detalles que considere, no se valida que el archivo de origen exista y que tengamos permisos de escritura en el directorio actual. Como comente lo escribí desde el Movil  ;D ;D  :silbar:

#include<stdio.h>
#include<stdlib.h>

#define BSIZE 512

char buffer = NULL;

int main(int argc, char **argv){
FILE *origen = NULL;
FILE *destino = NULL;
size_t leido;
if(argc < 3){
exit(0);
}
buffer = malloc(BSIZE);
origen = fopen(argv[1],"rb");
destino = fopen(argv[2],"wb");
if(!origen &&  !destino && !buffer ){
exit(0);
}
while(!feof(origen)){
leido = fread(buffer,BSIZE,origen);
if(0 < leido)
fwrite(buffer,1,leido,destino);
}
fclose(origen);
fclose(destino);
return 0;
}
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

do-while

¡Buenas!

Si vas a leer desde un archivo que no sea de texto olvídate de utilizar la función feof. Lo más normal es que el indicador de fin de archivo se active antes de llegar al final y que acabes con un archivo incompleto.

Lo que tendrías que hacer es usar funciones que te permitan saber cual es el tamaño del archivo. En las librerías estándar de C y C++ tienes funciones y miembros de clases de entrada/salida que te permiten ir a una posición en concreto de un archivo y saber en que posición estás, combinarlas para obtener el tamaño es cosa tuya, una vez que conozcas ese dato ya podrás leer todos los datos que contiene el archivo.
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

antoniosan20

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main (int argc, char *argv[])
{
if (argc < 3){
printf("Hacen falta parametros\n");
return -1;
      }
   else if(argc > 3){
     printf("Hay exceso de parametros\n");
        return -1;

}

        else {

          int f_origen, f_destino, buffer, opcion;
          f_origen=open(argv[1], O_RDONLY);
          if(f_origen < 0){
          printf("fichero 1 no existe, por favor intente de nuevo");
           return -1;
           }
           f_destino = open(argv[2], O_RDWR);
           if(f_destino < 0){
            printf("%s creado!!\n", argv[2]);
            f_destino = creat(argv[2],0777);
               
                 while(read(f_origen, &buffer, sizeof(buffer)) > 0){
                     write(f_destino, &buffer, sizeof(buffer));
                                   }
                   close(f_origen);
                   close(f_destino);
                   return -1;
               }
         

              else{
               printf("Desea sobre escribir?: 1-Si 2-No\n");
                 scanf("%d", &opcion);
               
                 if(opcion == 1){

                    f_destino =  open(argv[2], O_CREAT | O_RDWR);
                       while(read(f_origen, &buffer, sizeof(buffer)) > 0){
                     write(f_destino, &buffer, sizeof(buffer));

                        }
                          close(f_origen);
                   close(f_destino);
                   return -1;

                       }
                          else{
                              printf("Cerrando el proceso");
                               close(f_origen);
                                 return -1;
                                  }

               }
}
                                  return 0;

          }

antoniosan20

bueno. me funciono. gracias por la ayuda.
pero ahora quiero hacer con este mismo programa hacer un mapeo... tienen alguna idea que me pueda servir... estoy trabajando desde ubuntu... gracias...!

AlbertoBSD

Hola que bueno que lograras hacerlo por tu cuenta o por lo menos eso espero que sea.

Y que minimo te sirviera de algo el codigo que te puse...  :P ya que a mi forma de ver las cosas era más sencillo mi codigo que el que pusiste

Si gustas crea un nuevo tema para tu otro problema y explica mejor que es lo que quieres hacer.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW