Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: antoniosan20 en 9 Agosto 2016, 07:12 am



Título: ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu
Publicado por: antoniosan20 en 9 Agosto 2016, 07:12 am
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...!


Título: Re: ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu
Publicado por: tincopasan en 9 Agosto 2016, 12:36 pm
te faltó aclarar para que S.O y si tiene que recibir la misma cantidad de parámetros.


Título: Re: ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu
Publicado por: AlbertoBSD en 9 Agosto 2016, 15:27 pm
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.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. char buffer[256];
  5.  
  6. int main(int argc, char **argv){
  7. FILE *origen = NULL;
  8. FILE *destino = NULL;
  9. size_t leido;
  10. if(argc < 3){
  11. exit(0);
  12. }
  13. origen = fopen(argv[1],"rb");
  14. destino = fopen(argv[2],"wb");
  15. while(!feof(origen)){
  16. leido = fread(buffer,1,256,origen);
  17. fwrite(buffer,1,leido,destino);
  18. }
  19. fclose(origen);
  20. fclose(destino);
  21. return 0;
  22. }
  23.  

saludos!


Título: Re: ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu
Publicado por: class_OpenGL en 9 Agosto 2016, 18:43 pm
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:

Código
  1. while(!feof(origen)){
  2. leido = fread(buffer,1,256,origen);
  3. if(0 < leido)
  4. fwrite(buffer,1,leido,destino);
  5. }


Título: Re: ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu
Publicado por: AlbertoBSD en 9 Agosto 2016, 19:42 pm
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:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. #define BSIZE 512
  5.  
  6. char buffer = NULL;
  7.  
  8. int main(int argc, char **argv){
  9. FILE *origen = NULL;
  10. FILE *destino = NULL;
  11. size_t leido;
  12. if(argc < 3){
  13. exit(0);
  14. }
  15. buffer = malloc(BSIZE);
  16. origen = fopen(argv[1],"rb");
  17. destino = fopen(argv[2],"wb");
  18. if(!origen &&  !destino && !buffer ){
  19. exit(0);
  20. }
  21. while(!feof(origen)){
  22. leido = fread(buffer,BSIZE,origen);
  23. if(0 < leido)
  24. fwrite(buffer,1,leido,destino);
  25. }
  26. fclose(origen);
  27. fclose(destino);
  28. return 0;
  29. }


Título: Re: ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu
Publicado por: do-while en 10 Agosto 2016, 09:40 am
¡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.


Título: Re: ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu
Publicado por: antoniosan20 en 12 Agosto 2016, 07:28 am
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6.  
  7. int main (int argc, char *argv[])
  8. {
  9. if (argc < 3){
  10. printf("Hacen falta parametros\n");
  11. return -1;
  12.       }
  13.    else if(argc > 3){
  14.      printf("Hay exceso de parametros\n");
  15.         return -1;
  16.  
  17. }
  18.  
  19.         else {
  20.  
  21.           int f_origen, f_destino, buffer, opcion;
  22.           f_origen=open(argv[1], O_RDONLY);
  23.           if(f_origen < 0){
  24.           printf("fichero 1 no existe, por favor intente de nuevo");
  25.            return -1;
  26.            }
  27.            f_destino = open(argv[2], O_RDWR);
  28.            if(f_destino < 0){
  29.             printf("%s creado!!\n", argv[2]);
  30.             f_destino = creat(argv[2],0777);
  31.  
  32.                  while(read(f_origen, &buffer, sizeof(buffer)) > 0){
  33.                      write(f_destino, &buffer, sizeof(buffer));
  34.                                    }
  35.                    close(f_origen);
  36.                    close(f_destino);
  37.                    return -1;
  38.                }
  39.  
  40.  
  41.               else{
  42.                printf("Desea sobre escribir?: 1-Si 2-No\n");
  43.                  scanf("%d", &opcion);
  44.  
  45.                  if(opcion == 1){
  46.  
  47.                     f_destino =  open(argv[2], O_CREAT | O_RDWR);
  48.                        while(read(f_origen, &buffer, sizeof(buffer)) > 0){
  49.                      write(f_destino, &buffer, sizeof(buffer));
  50.  
  51.                         }
  52.                           close(f_origen);
  53.                    close(f_destino);
  54.                    return -1;
  55.  
  56.                        }
  57.                           else{
  58.                               printf("Cerrando el proceso");
  59.                                close(f_origen);
  60.                                  return -1;
  61.                                   }
  62.  
  63.                }
  64. }
  65.                                   return 0;
  66.  
  67.           }


Título: Re: ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu
Publicado por: antoniosan20 en 12 Agosto 2016, 07:30 am
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...!


Título: Re: ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu
Publicado por: AlbertoBSD en 12 Agosto 2016, 07:59 am
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.