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

Por qué esto no funciona? Misterios de C...

Estas en el tema de Por qué esto no funciona? Misterios de C... en el foro de C/C++ en Foros del Web. Resumiendo un poco, estaba implementando ciertas funciones que producían un resultado sobre un archivo. Una vez comprobado que funcionaba bien, lo metí todo dentro de ...
  #1 (permalink)  
Antiguo 16/04/2009, 09:14
 
Fecha de Ingreso: marzo-2009
Mensajes: 16
Antigüedad: 15 años, 8 meses
Puntos: 0
Por qué esto no funciona? Misterios de C...

Resumiendo un poco, estaba implementando ciertas funciones que producían un resultado sobre un archivo. Una vez comprobado que funcionaba bien, lo metí todo dentro de un bucle que te dejaba elegir entre varias opciones, y una era llamar a estas funciones. Resulta que cuando añadí el menú de selección de funciones me dejó de dar el resultado en el fichero. Fui recortando para ver el fallo hasta que me di cuenta de que el problema es el bucle, de forma que algo como esto:


Código:
char buff[1024];
FILE *salida=fopen("prueba","wb");
printf("Introducir texto: ");
scanf("%s",buff);
fwrite((void *)buff,1,strlen(buff),salida);
funciona a la perfección, pero si le pongo esto:

Código:
char buff[1024];
FILE *salida=fopen("prueba","wb");
while(1) {
printf("Introducir texto: ");
scanf("%s",buff);
fwrite((void *)buff,1,strlen(buff),salida);
}
Me produce un fichero vacío. Cuál es el problema?
  #2 (permalink)  
Antiguo 16/04/2009, 10:39
Avatar de fradve  
Fecha de Ingreso: abril-2009
Mensajes: 157
Antigüedad: 15 años, 7 meses
Puntos: 7
Respuesta: Por qué esto no funciona? Misterios de C...

Hola,


Revisando tu código veo algo particular, tu tienes esto:

Código c:
Ver original
  1. char buff[1024];
  2. FILE *salida=fopen("prueba","wb");
  3. printf("Introducir texto: ");
  4. scanf("%s",buff);
fwrite((void *)buff,1,strlen(buff),salida);

tu fwrite debe ir asi fwrite((void *)buff,strlen(buff),1,salida);

Bueno en una parte eso, en realidad no explicas de que se trata bien tu programa pero aqui te escribo un código que hace lo que pides:

Código c:
Ver original
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<string.h>
  4.  
  5. FILE *pf;
  6. void main()
  7. {
  8.   char key;
  9.  
  10.   pf=fopen("prueba.txt","w");
  11.   do
  12.   {
  13.    char buff[1024]="";
  14.    clrscr();
  15.    printf("INGRESE LA CADENA DE TEXTO: ");
  16.    gets(buff);
  17.    buff[strlen(buff)]='\n';
  18.    fwrite(buff,strlen(buff),1,pf);
  19.    printf("\nDESEA SEGUIR INGRESANDO TEXTO(S/N): ");
  20.    key=getche();
  21.   }while(key=='S'||key=='s');
  22.   fclose(pf);
  23. }

Espero que te sea de ayuda, ya que la información que das no es muy clara, sip....
  #3 (permalink)  
Antiguo 16/04/2009, 13:44
 
Fecha de Ingreso: marzo-2009
Mensajes: 16
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Por qué esto no funciona? Misterios de C...

Hola, el código lo puse bastante simplificado para ir al grano, ya que mi código original está repartido en varias funciones de diferentes ficheros y es relativamente complejo. De todas formas, mirando el ejemplo que pusiste, he cambiado scanf por gets y efectivamente de esa forma funciona. El problema es que la información que quiero escribir en el fichero realmente no es leída del teclado, como dije es sólo un ejemplo simplificado para que se viese cual es el meollo de la cuestión.

Lo que pretendo hacer en realidad es leer información de un socket y volcar parte de ella en un fichero. La información llega en varias piezas en diferentes momentos, por lo que la escritura es gradual, según voy recibiendo la información. En la práctica, lo que me llega no son las piezas enteras, sino subpiezas. Así que con la información que tengo que escribir me viene adjunto el indice de la pieza (en otras palabras, el desplazamiento dentro del fichero), el desplazamiento dentro de la pieza y el tamaño de esa subpieza. Los mensajes que recibo tienen este formato:

<longitud total (4bytes)><identificador (1 byte)><indice de pieza (4 bytes)><desplazamiento dentro de la pieza (4 bytes)><datos (x bytes)>

Cuando me llega este mensaje, leo la longitud total y el identificador, y en función del valor de este último, con un switch, decido qué hacer. El caso involucrado es este, donde se obtiene la información del desplazamiento y demás, y se escribe al fichero llamando a "volcar_a_fichero" (buff apunta a la parte del mensaje que estoy leyendo en cada momento):

Código:
case 7:

memcpy((void *)&index,buff,sizeof(int));
index=ntohl(index);
buff=buff+4;	
memcpy((void *)&begin,buff,sizeof(int));
begin=ntohl(begin);
buff=buff+4;
descarga->descargado[index]+=(tam-9);
offset=buff;		
volcar_a_fichero(descarga->fichero_fisico,index*descarga->tam_pieza+begin,tam-9,offset);
bytes+=tam-9;
printf("Recibiendo pieza %d, bloque %d, tamaño %d\n",index,begin,tam-9);

break;
"volcar_a_fichero" hace esto:

Código:
void volcar_a_fichero(FILE *fichero,int desplazamiento,int lon,void *datos) {
	fseek(fichero,desplazamiento,SEEK_SET);
	fwrite(datos,1,lon,fichero);
}
El código que implementa el menú y que inicia el proceso de descarga de datos es el caso 1. El código que mostré antes estaría dentro de la función "descarga", que se llama dentro del if.

Código:
	while(1) {
		//Se muestran las opciones por pantalla...
		printf("Opción: ");
		scanf("%d",&opt);
		switch(opt) {
			case 1:
				descarga=preparar_descarga(buffer);
				if(descarga!=NULL) {
					descargar(descarga);
					liberar_descarga(descarga);
				}
				else printf("No se pudo realizar la descarga\n");				
				break;
                       //Otros casos....
			case 4:
				printf("Salir\n");
				return 0;
				break;
		}
	}
Y más o menos este es el asunto. Simplificando todo esto llegué al fallo concreto, que básicamente es lo que expliqué en el primer post. Espero que ayude un poco más, pero la verdad que creo que esto lía un poco más la cosa.

PD: sobre los parámetros de fwrite, creo que la forma correcta es la mía, ya que el segundo parámetro es la longitud de cada elemento individual a escribir (un byte en mi caso, por lo tanto 1), y el tercer parámetro es el número de elementos, o sea, strlen(...).
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 13:37.