Problema con Switch y ficheros.

Iniciado por assembly, 29 Agosto 2013, 03:20 AM

0 Miembros y 1 Visitante están viendo este tema.

assembly

Hola a todos, este es mi primer mensaje en el foro. Hace poco estoy estudiando este lenguaje por mi cuenta y me ha surgido una duda, yo trabajo con C.
El codigo lo que deberia hacer es leer de un fichero llamado "text" todos sus valores, y escribir en el fichero "text.txt" estos mismos valores pero en ANSI segun corresponda.
Para eso use un Switch, y en cada caso asigne una letra del abecedario a un valor en hexadecimal.

Este es el archivo "text" visto en hexadecimal:
http://imageshack.us/photo/my-images/818/hlhl.png/

Este es el codigo:

#include <stdio.h>
#include <iostream>
#define MAXLINE 300
int main()
{
   int size, i;
   char val[MAXLINE];
   
   FILE* f = fopen("./text", "r");
   fseek(f, 0x0, SEEK_END);
   size = ftell(f);
   fseek(f, 0x0, SEEK_SET);

   for(i = 0; i <= size; ++i)
         fread(&val, 1, sizeof (char), f);
         

   fclose (f);
   
   for(i = 0; i <= size; ++i){
         switch(val){
                                       
         case 0x0f:
              val = 'z';
              break;
         case 0x0c:
              val = 'y';
              break;
         case 0x01:
              val = 'x';
              break;
         case 0x13:
              val = 'u';
              break;
         case 0x10:
              val = 't';
              break;
         case 0x09:
              val = 's';
              break;
         case 0x05:
              val = 'r';
              break;
         case 0x34:
              val = 'q';
              break;
         case 0x16:
              val = 'p';
              break;
         case 0x0a:
              val = 'o';
              break;
         case 0x0e:
              val = 'n';
              break;
         case 0x06:
              val = 'm';
              break;  
         case 0x04:
              val = 'l';
              break;
         case 0x14:
              val = 'k';
              break;
         case 0x37:
              val = 'j';
              break;
         case 0x08:
              val = 'i';
              break;
         case 0x07:
              val = 'h';
              break;
         case 0x02:
              val = 'g';
              break;
         case 0x0d:
              val = 'f';
              break;
         case 0x19:
              val = 'e';
              break;
         case 0x12:
              val = 'd';
              break;
         case 0x36:
              val = 'c';
              break;
         case 0x11:
              val = 'b';
              break;
         case 0x32:
              val = 'a';
              break;
          default:
              val = '*';
              break;      

              }
         }
         
   FILE* h = fopen("./text.txt", "w");
   fseek(h, 0x0, SEEK_SET);
   
   for(i = 0; i <= size; ++i)
         fwrite(&val, sizeof(char), 1, h);

   fclose (h);


}

Y asi queda el archivo text.txt:

d*rxx*srh*rh*rg*********************g*******i****x**g***********i***********i********x**********************g**********x****t*****xx*****************************q**************************i*******************************************************g************


Hay algunos valores que los esta tomando como "default", por ejemplo en la imagen del archivo text estos son los ultimos valores:
22 03 0a 16 05 06 10 00

Si el switch trabaja correctamente deberia ser reemplazado por:
**o*rm**

El programa tiene algun fallo ya que no es eso lo que finalmente contiene el archivo text.txt.
Ya me había pasado antes algo similar en donde muchos valores no eran correctamente reemplazados y escritos en un archivo de texto.

¿Puede alguien ayudarme o marcarme cuales son mis errores?.

do-while

¡Buenas!

3 cosas:

Primero utiliza las etiquetas GeSHi para poner el código. Es el desplegable que hay al final de la primera fila de iconos en el modo de edición.

Segundo, pon los casos del switch en orden o te vas a volver loco tu, o nos vas a volver locos a nosotros buscando las etiquetas. Eso que tienes es un caos y no hay quién lo lea.

Tercero si el archivo tiene N bytes, no existe la posición N en un vector (la posición N es el elemento N+1), luego estás utilizando mal la condición de los for, ya que estás accediendo a una posición que no está dentro del vector.

Cambia eso y a ver que pasa.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

assembly

#2
Hola y gracias por responder.
Comprendo lo que dices sobre los N bytes. Pero entonces yo tengo la duda de:
¿debo restarle -1 a size que es la variable que almacenaba el tamaño total del archivo?.
Utilizo Dev c++ y no se como poner la etiquetas que mencionas, ¿puedes explicarme como hacerlo?

Este es el nuevo codigo:

#include <stdio.h>
#include <iostream>
#define MAXLINE 256
int main()
{
   int size, i;
   char val[MAXLINE];
   
   FILE* f = fopen("./text", "r");
   fseek(f, 0x0, SEEK_END);
   size = ftell(f);
   size -= 1;
   printf("size: %d", size);
   fseek(f, 0x0, SEEK_SET);

   for(i = 0; i < size; ++i){
         fread(&val, 1, sizeof (char), f);
         printf("\nval: %x\n", val);
         }

   fclose (f);
   
   for(i = 0; i <= size; ++i){
         switch(val){
                                       
         case 0x32:
              val = 'a';
              break;
             
         case 0x11:
              val = 'b';
              break;
             
         case 0x36:
              val = 'c';
              break;
             
         case 0x12:
              val = 'd';
              break;
             
         case 0x19:
              val = 'e';
              break;
             
         case 0x0d:
              val = 'f';
              break;
             
         case 0x02:
              val = 'g';
              break;
             
         case 0x07:
              val = 'h';
              break;
             
         case 0x08:
              val = 'i';
              break;
             
         case 0x37:
              val = 'j';
              break;
         
         case 0x14:
              val = 'k';
              break;
             
         case 0x04:
              val = 'l';
              break;
             
         case 0x06:
              val = 'm';
              break;  
         
         case 0x0e:
              val = 'n';
              break;
             
         case 0x0a:
              val = 'o';
              break;
             
         case 0x16:
              val = 'p';
              break;
             
         case 0x34:
              val = 'q';
              break;
             
         case 0x05:
              val = 'r';
              break;
             
         case 0x09:
              val = 's';
              break;
             
         case 0x10:
              val = 't';
              break;
             
         case 0x13:
              val = 'u';
              break;
             
         case 0x01:
              val = 'x';
              break;
         
         case 0x0c:
              val = 'y';
              break;  
         
         case 0x0f:
              val = 'z';
              break;  
             
          default:
              val = '*';
              break;  
              }
         }
         
   FILE* h = fopen("./text.txt", "w");
   fseek(h, 0x0, SEEK_SET);
   
   for(i = 0; i <= size; ++i)
         fwrite(&val, sizeof(char), 1, h);

   fclose (h);


}

Y esto es lo que entrega el archivo de texto:

d*rxx*srh*rh*rg*************i********x**********************g**********x****t*****xx*****************************q**************************i********************u**********************************g*******************************i***************************


----------------

Aun sigue siendo incorrecto, ¿Cual es mi error?.

Edit: me di cuenta tambien que el tamaño del arreglo tiene que ver, en la primera version habia colocado 300 cuando teoricamente solo necesito 256. Con 256 obtuve el resultado que puse arriba y con 300 obtuve esto:

d*rxx*srh*rh*rg*********************g*******i****x**g***********i***********i********x**********************g**********x****t*****xx*****************************q**************************i**********************s************q*******************g***********

¿Existe algun problema en ello? ¿Si de todas formas debería leer 256 bytes y no 300?.