elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con Switch y ficheros.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con Switch y ficheros.  (Leído 2,164 veces)
assembly

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Problema con Switch y ficheros.
« en: 29 Agosto 2013, 03:20 am »

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?.


« Última modificación: 29 Agosto 2013, 03:22 am por assembly » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema con Switch y ficheros.
« Respuesta #1 en: 29 Agosto 2013, 09:10 am »

¡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!


En línea

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

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Problema con Switch y ficheros.
« Respuesta #2 en: 31 Agosto 2013, 16:42 pm »

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?.
« Última modificación: 31 Agosto 2013, 16:46 pm por assembly » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con Switch
Programación C/C++
higor24 2 3,777 Último mensaje 19 Noviembre 2010, 16:41 pm
por Fer995
Problema con el Switch en C « 1 2 »
Programación C/C++
Samnov 13 11,913 Último mensaje 6 Diciembre 2010, 15:05 pm
por winroot
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines