Programación General > C/C++
como creo un executable con "wb"
proxy_lainux:
hola
tengo una duda, como puedo crear un archivo executable...
miren hice este codigo que nose si este bien... pero supuestamente lee el archivo que quiero... y no se como crear un archivo nuevo con la informacion de otro executable... por ejemplo
tengo el clasico hola mundo
--- Código: C ---#include <stdio.h> int main(){ printf("hola mundon");}
y tengo este codigo que como menciono, lee el archivo de hola mundo
--- Código: C ---#include <stdio.h>#include <string.h> int main(){ FILE *j;int arg; j = fopen("hola","rb"); arg = fgetc(j);while(!feof(j)){fputc(arg,j);arg = fgetc(j);printf("%c",arg);}fclose(j);}
pero quisiera saber como puedo hacer que el segundo codigo me haga un nuevo executable con "wb", que contenga la misma informacion de hola mundo
--- Código: C ---fclose(j);nw = fopen("nuevo","wb");
en otras palabras quiero hacer un programa que me diga "hola mundo", otro que abra, lea y haga un nuevo executable con la informacion de "hola mundo" y que ese nuevo executable tambien al executarlo me muestre "hola mundo"
alguien sabe que tengo que hacer?, por cierto si me lo pueden explicar para linux, se los agradeceria muchisimo..
salu2 :)
m0skit0:
--- Cita de: "proxy_lainux" ---como puedo crear un archivo executable...
--- Fin de la cita ---
Lo que tú quieres es copiar ficheros :P
Por ejemplo:
--- Código: C ---#include <stdio.h>#include <string.h> int main(){ FILE *fentrada, *fsalida; char un_byte; fentrada = fopen("hola","rb"); fsalida = fopen("hola2","wb"); while(!feof(fentrada)){ fread(&un_byte,1,1,fentrada); fwrite(&un_byte,1,1,fsalida); } fclose(fentrada); fclose(fsalida); return 0;} Sin probar, pero debería funcionar.
Saludos
proxy_lainux:
hola
gracias por la explicacion... mira ya mas o menos entendi... pero tengo una duda, hice esto, y el archivo de hola mundo se copia bien
--- Código: C ---#include <stdio.h>#include <string.h> int main(){ FILE *j;FILE *h;unsigned long i;char g[10000]; j = fopen("hola","rb"); while(!feof(j)){fgetc(j);i++;}fseek(j,0,SEEK_SET);fread(g,sizeof(g),1,j); close(j); h = fopen("hola2","wb");fwrite(g,i,1,h);fclose(h);}
pero si intento copiar archivos grandes al revisarlos en propiedades el tamaño del archivo es 0... me imagino que es por
--- Código: C --- char g[10000];}
y por
--- Código: C ---while(!feof(j)){fgetc(j);i++;}
me dijeron que para saber el tamaño exacto del codigo que hiciera esto
--- Código: C --- unsigned long i, pos, len;unsigned char g; j = fopen("join.rar","rb") pos = ftell(j)fseek(j,0,seek_end);len = ftell(j);fseek(j,pos,seek_set);
y me quedaria asi el codigo
--- Código: C ---#include <stdio.h>#include <string.h> int main(){ FILE *j;FILE *h;unsigned long pos, i, len;unsigned char g; j = fopen("hola","rb"); pos = ftell(j);fseek(j,0,SEEK_END);len = ftell(j);fseek(j,pos,SEEK_SET); for(i = 0; i < len; i++){fread(&g,1,1,j);}close(j); h = fopen("hola2","wb");fwrite(&g,i,1,h);fclose(h);}
el problema es que tampoco funciona a menos de que haga esto
--- Código: C ---#include <stdio.h>#include <string.h> int main(){ FILE *j;FILE *h;unsigned long pos, i, len;unsigned char g; j = fopen("Lie.rar","rb");h = fopen("hola2.rar","wb"); pos = ftell(j);fseek(j,0,SEEK_END);len = ftell(j);fseek(j,pos,SEEK_SET); for(i = 0; i < len; i++){fread(&g,1,1,j);fwrite(&g,1,1,h);} close(j);fclose(h);}
si ven incluso puedo copiar archivos grandes.... pero porque el otro codigo no me funciono, que estoy haciendo mal, y el primer codigo porque no puedo copiar archivos grandes
es que necesito leer varios archivos y al final usar fwrite, pero no se que estoy haciendo mal... es que estoy tratando de aprender como hacer un joiner... porque como nose como manejar bien fseek, y uso de ficheros, etc.. imagine que haciendo un joiner podre aprender mas... y por lo que pueden ver apenas estoy aprendiendo a copiar un fichero
espero me puedan explicar porfavor
salu2
m0skit0:
:hola:
Primero un consejo: usa nombres de variables que se entiendan, no j, k, h... no hay quien sepa qué es eso :P Por ejemplo, el descriptor de fichero puedes ponerle una f seguida de algo explicativo como por ejemplo fentrada o fsalida.
--- Cita de: "proxy_lainux" ---que estoy haciendo mal
--- Fin de la cita ---
Tu problema radica en los buffers (o almacenamientos intermedios, pero es muy largo :lol: ). Tú usas char g[10000] como buffer, que te almacena como máximo 10000 carácteres, o lo que es lo mismo, bytes. Por tanto (si quieres compruébalo ;)) el tamaño máximo de fichero que podrás manejar será de ese mismo tamaño, esto es, 10.000 bytes o ~9.75 KB.
El código que has hecho:
--- Código: C ---j = fopen("hola","rb"); while(!feof(j)){ fgetc(j); i++;} Te falta inicializar la variable con i=0, que no lo veo por ninguna parte :P Aquí obtienes el tamaño del fichero en i, pero a costa de recorrerlo entero. Esto es inútil lento ya que el SO ya sabe el tamaño exacto del fichero ;) . Como bien te dijeron, el tamaño del fichero lo obtienes asÍ:
--- Código: Text ---pos = ftell(j);fseek(j,0,seek_end);len = ftell(j); Ahora tienes en len (del inglés length, longitud o tamaño), que corresponde con tu i. Pero tú usas un buffer de tamaño fijo, es decir, si el fichero es más grande no cabrá en tu buffer. Tienes tres soluciones:
[list type=3]
[li]Limitar tu programa a que sólo copie ficheros de un determinado tamaño o menor (es una opción :lol: )[/li]
[li]Hacer un buffer gigantesco en previsión, con el consiguiente gasto de memoria: peor solución que la anterior :D [/li]
[li]Copiar el fichero a cachos en un buffer pequeño. Por cada buffer lleno lo escribimos en el fichero de salida.[/li][/list]
¿Se te ocurre cómo podrías implementar esta última solución? :comp:
proxy_lainux:
hola
jeje :P lo siento, tratare de cambiar los nombres de las variables...
y bueno, con respecto a lo que me mencionas... pues a mi lo que se me ocurre es partir len en partes de un byte "por ejemplo"... y hacer que fread vaya leyendo byte por byte... y por cada byte leido, mandarlo a fwrite y borrar la informacion del buffer para volver a leer otro byte y mandarlo a fwrite y asi continuamente hasta finalizar con el archivo, y asi de esa manera podria crear un buffer pequeño que vaya leyendo y escribiendo la informacion...
el problema es que no se dividir el archivo en secciones de 1 byte, seria algo asi?
--- Código: C ---for (i = 0; i < len / 10000; i++)
jeje, bueno la verdad no tengo idea, pero me imagine esto.. jeje :P
la duda que tengo es, si necesito leer con fread la informacion del archivo, como podria hacer que antes de mandarlo a fwrite, lo guarde en algun lado para concatenarlo con una firma, para despues leer el archivo que voy a unir y concatenarlo
por ejemplo
--- Código: C ---strcpy(final,archivo);strcat(final,[#==#]strcat(final,archivo2);
archivo seria, el programa que va a extraer los demas archivos, "unjoiner"
despues vendria la primera firma
y archivo2 seria el archivo que se va a extraer
bueno.. tengo pensado solo utilizar la variable archivo, y despues borrarle la informacion y volverlo a usar para no repetir tanto codigo, pero lo pongo asi para darme a entender mejor
me imagino que despues tengo que utilizar strlen para sacar la longitud de la variable final y entonces finalizar con fwrite ¿no?
--- Código: C ---lenfinal += strlen(final) fwrite(final,lenfinal,1,salida);
o habra otra forma de leer el contenido del archivo para hacer lo de copiar, concatenar, etc..?
salu2 :lol:
Navegación
[#] Página Siguiente
Ir a la versión completa