UTNianos

Versión completa: [DUDA] Ejercicio de TP Streams
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Escriba un programa que permita copiar archivos de cualquier tipo. Llámelo
copy. Recibe por línea de comandos el path del archivo fuente en primer lugar y
luego separado por uno o mas espacios o tabs, el path de destino. Compruebe
que ambos argumentos están disponibles, y de otro modo no prosiga con la
copia e informe al usuario el modo correcto de invocación de copy.
Uso: copy <path archivo origen> <path archivo destino>

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


int main(int argc, char *arg[])

{
char buffer[40];
FILE *fp;
FILE *fp1;

fp= fopen(arg[1],"rt");
fp1=fopen(arg[2],"w+t");

fread(&buffer,sizeof(buffer),1,fp);

while( (feof(fp))==0)
{
fwrite(&buffer,sizeof(char),1,fp1); // escribo en el archivo destino lo leido en el archivo origen
fread(&buffer,sizeof(buffer),1,fp);
}

fclose(fp);
fclose(fp1);

return 0;
}

Cuando lo ejecuto, ingreso por argumentos del main , los 2 paths, el del archivo que quiero copiar, y el path del lugar donde quiero copiar el archivo.Y me aparece "Segmentation fault (core dumped)"
Eso es porque los parámetros que le estás asignando al main no son compatibles con lo que ingresás al ejecutar el programa. Los argumentos deberían ser ambos iguales, del tipo del path del archivo.

Con los argumentos que vos estás pasandole al main, por ej., podrías hacer un programa que la línea de ejecución sea el nombre del programa seguido de la línea de un archivo (1,2,3,etc.) y el path del archivo en sí. Lo que podría hacer, es copiar esa línea en un nuevo archivo que creás vos dentro del código.


Off-topic:
Fijate de cambiar eso, y sino esperá la respuesta de alguien que esté más fresco con el tema.

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *arg[])
{
char buffer[40];
FILE *fp;
FILE *fp1;
int bytesR;
fp= fopen(arg[1],"rt");
fp1=fopen(arg[2],"w+t");
/*buffer= malloc(fp->_cnt);
free(buffer);*/
while( (feof(fp))==0)
{
bytesR=fread(buffer,1,sizeof(buffer),fp);
fwrite(buffer,1,bytesR,fp1); // escribo en el archivo destino lo leido en el archivo origen
}
fclose(fp);
fclose(fp1);
return 0;
}


bueno en tu codigo el principal problema que tenes es en las funciones fwrite y fread ya que no le estas pasando la direccion del bufer, si declaro un vector o un puntero(char vect[] o char *vect), la direccion es en ambos casos vect, pero si lo declaro como una variable su direccion es &vect(siempre que el prototipo diga * le tenes que pasar la direccion de memoria y no el valor).
otra cosa que confunde es el segundo/tercer parametro de la funciones fread y fwrite,si no conoces el tamaño del archivo que lees no podes decirla a la funcion que lea de a bloques, haci que combiene que lea de a un byte sizeof(buffer) veces.

pd:al codigo le faltan detalles como proteccion de errores de escritura/lectrura o que pases mal los parametros al main).
otra cosa que no encontre ni en el stdio.h son los campos de la estructura file (saber el tamaño me serviria para hacer esto de manera dinamica).
pd2:estoy preparando final para esto haci que me viene bien practicar estas cosas.
URLs de referencia