Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Como hacer esto

Estas en el tema de Como hacer esto en el foro de C/C++ en Foros del Web. Hola necesito hacer algo asi: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original for ( int a = 0 ; a < 11 ; a ++ ) ...
  #1 (permalink)  
Antiguo 29/05/2013, 14:01
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 10 meses
Puntos: 29
Como hacer esto

Hola necesito hacer algo asi:

Código C++:
Ver original
  1. for(int a=0;a<11;a++){
  2. FILE *archivo;
  3. fopen(&archivo,"cosa"+a+".txt","wt");//El problema esta en "cosa"+a+".txt"
  4. }

Como hacer lo ?
  #2 (permalink)  
Antiguo 29/05/2013, 14:42
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 6 meses
Puntos: 228
Respuesta: Como hacer esto

Usa strcat:
http://www.cplusplus.com/reference/cstring/strcat/
  #3 (permalink)  
Antiguo 29/05/2013, 15:04
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 7 meses
Puntos: 1360
Respuesta: Como hacer esto

Mejor usa sprintf

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5.     char filename[80];
  6.  
  7.     for(int a=0;a<11;a++){
  8.         FILE *archivo;
  9.         sprintf(filename, "cosa%d.txt", a);
  10.         fopen(&archivo, filename, "wt");//El problema esta en "cosa"+a+".txt"
  11.     }
  12.     return 0;
  13. }
  #4 (permalink)  
Antiguo 29/05/2013, 23:48
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 10 meses
Puntos: 29
Respuesta: Como hacer esto

Hola gracias a los dos, voy a usar sprintf_s es menos codigo. Ademas para strcat el int a debe de ser char y no se como convertirlo. Ya que antes probé con esta.

Cuando el programa estaba listo y lo abri todo funciono bien, creo 10 archivos con los nombres bien hechos y el contenido era:

Código C++:
Ver original
  1. if(archivo==NULL){
  2.             printf("Se produjo un error al intentar crear el archivo. ");
  3.         }else{
  4.             char bc[100000]="aasdsadasdasdadsadasdsadadad";
  5.             for(int b=0;b<10000;b++){
  6.                 strcat_s(bc,"a");
  7.                 fwrite(&bc,sizeof(bc),1,archivo);
  8.             }
  9.             printf("bien");

Osea bien, pero lo crea demasiado lento, 10 archivos como 5m cada uno de 1 mb . Hay alguna manera de hacer lo mas rápido o ocultar el cmd para que el usuario pueda hacer otras cosas mientras y el proceso no le moleste?
  #5 (permalink)  
Antiguo 30/05/2013, 08:06
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Como hacer esto

Si los archivos o los datos no tienen nada que ver entre si puedes crearlos con procesos paralelos; te puedo comentar como hacerlos desde la win32 api:

Código:
unsigned long WINAPI WriteProcess(void *lpvoid) { 
    FILE *arxptr = (FILE *)lpvoid;
    char bc[100000]="aasdsadasdasdadsadasdsadadad";
    int b;
    
    for(b = 0; b < 10000; b++){
        strcat(bc, "a");
        fwrite(bc, sizeof(bc), 1, arxptr);
    }
    
    fclose(arxptr);
    printf("OK\n");
    
    return 0; 
} 



int main() {
	FILE *arx;
	int file_ctr;
	char filename[80];
	void *hProc;
	unsigned long dw; 
	
	for(file_ctr = 0; file_ctr < 11; file_ctr++) {
        sprintf(filename, "file%d.txt", file_ctr);
        if((arx = fopen(filename, "wt"))) {
    		if(!(hProc= CreateThread(NULL, 0, WriteProcess, arx, 0, &dw))) {
                                //error en crear el proceso
				fclose(arx);
			}
		}
                else {
                    CloseHandle(hProc);
                }
	}
        else {
            //error en crear el archivo
        }
	return 0;
}
Creo que esto de los multiprocesos es dependiente del s.o., y creo recordar que mas o menos funcionan de forma parecida: puedes enviar un argumento al proceso. En este caso no puedes enviar el nombre porque es reutilizable, en cambio si que le puedes enviar el puntero de manejo del archivo porque se genero de forma dinamica. Ten en cuenta que una vez hayas abierto el 2º puntero no tendras forma de eliminar el primero porque el puntero apuntara al bloque de memoria reservado para el segundo manejador (lo mismo sucedera entre los demas y sus siguientes): por eso cierro en archivo desde el proceso ya que le envio el puntero antes de sobreescribirlo. Podrias hacer una lista dinamica con una struct de datos referentes al archivo o a los datos que debera contener de forma que pudieses enviar una referencia de cada elemento al proceso y desde el proceso mostrar mas informacion (en el ejemplo desde el proceso no puedes hacer referencia ni al nombre del archivo).

Saludos
vosk
  #6 (permalink)  
Antiguo 30/05/2013, 08:15
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Como hacer esto

Por cierto que se olvidaba: despues del bucle donde creas los procesos puedes poner lo que quieras y se ejecutará immediatamente sin esperar que se hayan terminado de escribir los archivos. Solo tienes que tener en cuenta que no debes acceder a los archivos porque aun no estan terminados (si los abres con las win32 api en modo de compartir lectura podras leer lo que de momento tengan escrito). Por eso si optas por los multiprocesos es importante que te crees una lista de tareas para que cada proceso pueda indicar manejar mas cosas: p.ej. una lista de structs con una ruta (o un puntero al FILE) y un estado de trabajo o un indicador de porcentaje, de esta forma cuando tengas corriendo todos los procesos podras consultar el estado de cada uno.

Saludos
vosk

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:11.