• Jueves 18 de Abril de 2024, 03:35

Autor Tema:  como creo un executable con "wb"  (Leído 2254 veces)

proxy_lainux

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
como creo un executable con "wb"
« en: Jueves 11 de Junio de 2009, 21:07 »
0
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
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  
  5. printf("hola mundon");
  6. }
  7.  

y tengo este codigo que como menciono, lee el archivo de hola mundo

Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(){
  5.  
  6. FILE *j;
  7. int arg;
  8.  
  9. j = fopen("hola","rb");
  10.  
  11. arg = fgetc(j);
  12. while(!feof(j)){
  13. fputc(arg,j);
  14. arg = fgetc(j);
  15. printf("%c",arg);
  16. }
  17. fclose(j);
  18. }
  19.  

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
  1. fclose(j);
  2. nw = fopen("nuevo","wb");
  3.  

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

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: como creo un executable con "wb"
« Respuesta #1 en: Viernes 12 de Junio de 2009, 14:44 »
0
Cita de: "proxy_lainux"
como puedo crear un archivo executable...
Lo que tú quieres es copiar ficheros  :P

Por ejemplo:
Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(){
  5.  
  6.     FILE *fentrada, *fsalida;
  7.     char un_byte;    
  8.  
  9.     fentrada = fopen("hola","rb");
  10.     fsalida = fopen("hola2","wb");
  11.  
  12.     while(!feof(fentrada)){
  13.         fread(&un_byte,1,1,fentrada);        
  14.         fwrite(&un_byte,1,1,fsalida);
  15.     }
  16.  
  17.     fclose(fentrada);
  18.     fclose(fsalida);
  19.  
  20.     return 0;
  21. }
  22.  
Sin probar, pero debería funcionar.

Saludos

proxy_lainux

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: como creo un executable con "wb"
« Respuesta #2 en: Viernes 12 de Junio de 2009, 18:37 »
0
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
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(){
  5.  
  6. FILE *j;
  7. FILE *h;
  8. unsigned long  i;
  9. char g[10000];
  10.  
  11. j = fopen("hola","rb");
  12.  
  13. while(!feof(j)){
  14. fgetc(j);
  15. i++;
  16. }
  17. fseek(j,0,SEEK_SET);
  18. fread(g,sizeof(g),1,j);
  19.  
  20. close(j);
  21.  
  22. h = fopen("hola2","wb");
  23. fwrite(g,i,1,h);
  24. fclose(h);
  25. }
  26.  


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
  1.  
  2. char g[10000];
  3. }
  4.  

y por

Código: C
  1. while(!feof(j)){
  2. fgetc(j);
  3. i++;
  4. }
  5.  

me dijeron que para saber el tamaño exacto del codigo que hiciera esto

Código: C
  1.  
  2. unsigned long i, pos, len;
  3. unsigned char g;
  4.  
  5. j = fopen("join.rar","rb")
  6.  
  7. pos = ftell(j)
  8. fseek(j,0,seek_end);
  9. len = ftell(j);
  10. fseek(j,pos,seek_set);
  11.  
  12.  

y me quedaria asi el codigo

Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(){
  5.  
  6. FILE *j;
  7. FILE *h;
  8. unsigned long pos, i, len;
  9. unsigned char g;
  10.  
  11. j = fopen("hola","rb");
  12.  
  13. pos = ftell(j);
  14. fseek(j,0,SEEK_END);
  15. len = ftell(j);
  16. fseek(j,pos,SEEK_SET);
  17.  
  18. for(i = 0; i < len; i++){
  19. fread(&g,1,1,j);
  20. }
  21. close(j);
  22.  
  23. h = fopen("hola2","wb");
  24. fwrite(&g,i,1,h);
  25. fclose(h);
  26. }
  27.  

el problema es que tampoco funciona a menos de que haga esto

Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(){
  5.  
  6. FILE *j;
  7. FILE *h;
  8. unsigned long pos, i, len;
  9. unsigned char g;
  10.  
  11. j = fopen("Lie.rar","rb");
  12. h = fopen("hola2.rar","wb");
  13.  
  14. pos = ftell(j);
  15. fseek(j,0,SEEK_END);
  16. len = ftell(j);
  17. fseek(j,pos,SEEK_SET);
  18.  
  19. for(i = 0; i < len; i++){
  20. fread(&g,1,1,j);
  21. fwrite(&g,1,1,h);
  22. }
  23.  
  24. close(j);
  25. fclose(h);
  26. }
  27.  

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

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: como creo un executable con "wb"
« Respuesta #3 en: Sábado 13 de Junio de 2009, 20:47 »
0
: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
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
  1. j = fopen("hola","rb");
  2.  
  3. while(!feof(j)){
  4.     fgetc(j);
  5.     i++;
  6. }
  7.  
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
  1. pos = ftell(j);
  2. fseek(j,0,seek_end);
  3. len = ftell(j);
  4.  
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:
« última modificación: Lunes 15 de Junio de 2009, 12:43 por m0skit0 »

proxy_lainux

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: como creo un executable con "wb"
« Respuesta #4 en: Domingo 14 de Junio de 2009, 19:30 »
0
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
  1. for (i = 0; i < len / 10000; i++)
  2.  

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
  1. strcpy(final,archivo);
  2. strcat(final,[#==#]
  3. strcat(final,archivo2);
  4.  

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
  1. lenfinal += strlen(final)
  2.  
  3. fwrite(final,lenfinal,1,salida);
  4.  

o habra otra forma de leer el contenido del archivo para hacer lo de copiar, concatenar, etc..?

salu2  :lol:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: como creo un executable con "wb"
« Respuesta #5 en: Lunes 15 de Junio de 2009, 13:19 »
0
No te precipites, primero haz un programa que copie el contenido de un fichero a otro y luego ya vemos lo de concatenar fichero (que también es muy sencillo) ^_^

Cita de: "proxy_lainux"
ues 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...
Sí, buena idea, pero dos cosillas:

  • El for que has puesto no le veo mucho sentido...  ¿De dónde sacas lo de 10000  :huh: ? Eso ya no vale, estás usando un buffer de 1 byte. Sería simplemente:

    Código: C
    1. for (i = 0; i < len; i++)
    2.  
  • Un buffer de un byte sería demasiado pequeño a mi parecer, ya que habría que estar llamando a las funciones fread() y fwrite() una vez por byte, lo que ralentizaría mucho el copiado. Además, el SO lee generalmente el disco por sectores lógicos (512-1024-2048 bytes), y no por bytes, convendría usar un buffer igual o múltiplo que estas figuras para optimizar las llamadas a fread().

proxy_lainux

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: como creo un executable con "wb"
« Respuesta #6 en: Lunes 15 de Junio de 2009, 19:48 »
0
hola

jeje..  :P  lo de for como lo mencione, no tenia idea, pero me imagine algo asi para partir len en bytes... pero ya que me explicaste eso...  no entiendo como podria ir copiando parte por parte.. mira este codigo que hice, me copia bien archivos menores de 1mb

Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(){
  5.  
  6. FILE *entrada;
  7. FILE *salida;
  8. unsigned long pos, i, len;
  9. unsigned char buf[1000000];
  10.  
  11. entrada = fopen("lie.tar.gz","rb");
  12.  
  13. pos = ftell(entrada);
  14. fseek(entrada,0,SEEK_END);
  15. len = ftell(entrada);
  16. fseek(entrada,pos,SEEK_SET);
  17.  
  18. for(i = 0; i < len; i++){
  19. fread(buf,sizeof(buf),1,entrada);
  20. }
  21. close(entrada);
  22.  
  23. salida = fopen("true.tar.gz","wb");
  24. fwrite(buf,len,1,salida);
  25. fclose(salida);
  26. }
  27.  

y me imagino que para algo optimo, tendria que ir copiando de 512 kb a 1mb no?... y con este codigo he logrado copiar archivos que no sobrepasen 1mb... y creo que aqui es donde tengo que ir copiando mb por mb para ir escribiendo en fwrite no? ya que he intentado copiar archivos de mas de 10mb pero el buffer es muy pequeño

pero como podria decirle a fread que me lea 1000000 caracteres... que me los mande a fwrite ( me imagino que tendre que utilizar zeromemory o memset para borrar el buffer ) y como continuar leyendo con fread, para repetir todo hasta terminar de copiar el archivo...

se me ha ocurrido algo con while y con if... pero cuando continuo me encuentro con algun error  :(

alguna idea?

salu2  :D

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: como creo un executable con "wb"
« Respuesta #7 en: Martes 16 de Junio de 2009, 12:19 »
0
Cita de: "proxy_lainux"
mira este codigo que hice, me copia bien archivos menores de 1mb
:P ahí estás implementando una mezcla entre la primera y la segunda solución de las que te hablaba  :bad:

Cita de: "proxy_lainux"
tendria que ir copiando de 512 kb a 1mb no?
No exactamente, sino más bien copiar cachos de 512 bytes (por ejemplo) hasta completar el tamaño del fichero. Aunque yo usaría 2048 bytes (o 2 KB).

Cita de: "proxy_lainux"
pero como podria decirle a fread que me lea 1000000 caracteres...
Eso no es solución. La próxima vas a querer más caracteres, y más y más...

Cita de: "proxy_lainux"
me imagino que tendre que utilizar zeromemory o memset para borrar el buffer
No hace falta borrar el buffer, lo vas a sobreescribir ;)

Cita de: "proxy_lainux"
se me ha ocurrido algo con while y con if
Ponlo para que lo veamos juntitos  :D

Cita de: "proxy_lainux"
alguna idea?
Hombre, yo ya sé hacerlo, incluso el concatenador de ficheros, pero la cuestión es que seas el que lo haga  :P

proxy_lainux

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: como creo un executable con "wb"
« Respuesta #8 en: Miércoles 17 de Junio de 2009, 02:16 »
0
hola m0skit0

ahorita tengo varias cosas que hacer, y no voy a poder continuar por lo menos durante 15 dias mas o menos... asi que si no posteo algo es porque estare ocupado, pero espero me puedas seguir ayudando despues  :good:

y gracias por la ayuda, mientras tratare de pensar en algo, ok

bueno, salu2 y nuevamente... gracias por la ayuda

nos vemos  :D