Error en programa

Iniciado por apoeti, 7 Septiembre 2012, 14:43 PM

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

apoeti

Hola, soy yo otra vez con un error en un programa. Como siempre será algo muy básico que no he conseguido ver, pero aquí os pongo el código fuente:
#include <stdio.h>

main()
{
   FILE *fp;
   int count;
   char caracter="a";
   char filename[40];
   printf("Escriba la ruta del archivo: ");
   gets(filename);
   fp = fopen(filename,"r");
       
   while(caracter!=EOF)
   {
       for(count=0, (count<=280) && (caracter!=EOF), count++)
       {
           caracter=getc(fp);
           printf("%X", caracter);
       }
   
       printf("\n");
        rewind(fp);
   
       for(count=0, (count<=280) && (caracter!=EOF), count++)
       {
           caracter=getc(fp);
           printf("%c", caracter);
       }
           
       printf("\n");
   }
}


La idea es que se imprima un archivo en bloques de 280 caracteres en hexadecimal y en ASCII. La verdad es que ni yo mismo creo que este bien hecho de esta manera para imprimir en hexadecimal, pero bueno... Aquí os lo dejo. Espero vuestras correcciones y consejos.

Saludos.

0xDani

Pues para empezar, deberias acostumbrarte a ponerle valor de retorno a main, luego en el for usas comas en vez de punto y coma:
for(inicializacion;condicion;aumento/decremento)

Tambien podrias poner los errores que te da el compilador.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

DickGumshoe

Hola.

Además de los errores que ya te ha comentado 0xDani, te digo unos cuantos más:

El bucle while no es necesario, ya que al salir del segundo for la variable carácter será EOF. En el segundo bucle for, imprimes el carácter, ya que pones '%c'. Para imprimir el ASCII, lo que tienes que hacer es poner '%d'.

Al salir del primer bucle for ocurre una cosa: la variable carácter es EOF. Por lo tanto, como en la condición del segundo for tienes que se repita mientras carácter sea distinto de EOF, no entrará, y no imprimirá el valor ASCII. Para evitarlo, debes darle un valor cualquiera a dicha variable entre un bucle y otro.

Por último, te recomiendo que cuando no vayas a volver a utilizar el fichero que has abierto, lo cierres con fclose(fp).

Aquí te dejo el código editado y comentado:


#include <stdio.h>

int main()
{
    FILE *fp;
    int count;
    char caracter; //Aquí no es necesario inicializar el carácter
    char filename[40];
    printf("Escriba la ruta del archivo: ");
    gets(filename);
    fp = fopen(filename,"r");

//No hace falta el bucle while, puesto que al salir del segundo "for" la variable carácter será EOF.
        for(count=0;(count<=280) && (caracter!=EOF); count++) //Aquí son ';', no ','
        {
            caracter=getc(fp);
            printf("%X ", caracter);
        }

        printf("\n");
        rewind(fp);
        caracter = 'a'; //Le damos un valor para que no sea EOF y pueda entrar en el bucle for.

        for(count=0;(count<=280) && (caracter!=EOF); count++)
        {
            caracter=getc(fp);
            printf("%d ", caracter);
        }

    fclose(fp);
    return 0;
}


Un saludo.

durasno

char caracter="a";
de esa forma estas asignando una cadena y no un caracter
Ahorrate una pregunta, lee el man

apoeti

#4
Siento haber caído en cosas tan triviales  :(. Eso sí, respecto a lo de que lo imprima en ASCII, depende de la interpretación, pues yo he entendido que imprima el carácter normal, no el número, para lo que sí haría falta %d. Y aun así, el programa no me funciona. Se supone que tiene que pasar el texto por bloques a hexadecimal y ASCII. Si uso el código fuente como fichero a leer, el programa arroja esto:

Escriba la ruta del archivo: ./16-9.c
bf9a1569

Otra cosilla, respecto a lo de poner valor de retorno a main, siempre he visto que la gente suele poner "int main()" y al final de main "return 0". He leído que es para reconocer errores y cosas así, pero no entiendo cómo sacarle partido ¿Me lo podéis explicar o pasarme algún enlace con información?

DickGumshoe

Qué raro... A mí me imprime el texto primero en hexadecimal y después en ASCII. Si pongo como archivo el código fuente de mi anterior mensaje, la salida es esta:

Escriba la ruta del archivo: l.c
23 69 6E 63 6C 75 64 65 20 3C 73 74 64 69 6F 2E 68 3E A A 69 6E 74 20 6D 61 69 6E 28 29 A 7B
A 20 20 20 20 46 49 4C 45 20 2A 66 70 3B A 20 20 20 20 69 6E 74 20 63 6F 75 6E 74 3B A 20 2
0 20 20 63 68 61 72 20 63 61 72 61 63 74 65 72 3B 20 2F 2F 41 71 75 FFFFFFED 20 6E 6F 20 65
73 20 6E 65 63 65 73 61 72 69 6F 20 69 6E 69 63 69 61 6C 69 7A 61 72 20 65 6C 20 63 61 72 FF
FFFFE1 63 74 65 72 A 20 20 20 20 63 68 61 72 20 66 69 6C 65 6E 61 6D 65 5B 34 30 5D 3B A 20
20 20 20 70 72 69 6E 74 66 28 22 45 73 63 72 69 62 61 20 6C 61 20 72 75 74 61 20 64 65 6C 20
61 72 63 68 69 76 6F 3A 20 22 29 3B A 20 20 20 20 67 65 74 73 28 66 69 6C 65 6E 61 6D 65 29
3B A 20 20 20 20 66 70 20 3D 20 66 6F 70 65 6E 28 66 69 6C 65 6E 61 6D 65 2C 22 72 22 29 3B
A A 2F 2F 4E 6F 20 68 61 63 65 20 66 61 6C 74 61 20 65 6C 20 62 75 63 6C 65 20 77 68 69 6C
65 2C 20 70 75
35 105 110 99 108 117 100 101 32 60 115 116 100 105 111 46 104 62 10 10 105 110 116 32 109 9
7 105 110 40 41 10 123 10 32 32 32 32 70 73 76 69 32 42 102 112 59 10 32 32 32 32 105 110 11
6 32 99 111 117 110 116 59 10 32 32 32 32 99 104 97 114 32 99 97 114 97 99 116 101 114 59 32
47 47 65 113 117 -19 32 110 111 32 101 115 32 110 101 99 101 115 97 114 105 111 32 105 110
105 99 105 97 108 105 122 97 114 32 101 108 32 99 97 114 -31 99 116 101 114 10 32 32 32 32 9
9 104 97 114 32 102 105 108 101 110 97 109 101 91 52 48 93 59 10 32 32 32 32 112 114 105 110
116 102 40 34 69 115 99 114 105 98 97 32 108 97 32 114 117 116 97 32 100 101 108 32 97 114
99 104 105 118 111 58 32 34 41 59 10 32 32 32 32 103 101 116 115 40 102 105 108 101 110 97 1
09 101 41 59 10 32 32 32 32 102 112 32 61 32 102 111 112 101 110 40 102 105 108 101 110 97 1
09 101 44 34 114 34 41 59 10 10 47 47 78 111 32 104 97 99 101 32 102 97 108 116 97 32 101 10
8 32 98 117 99 108 101 32 119 104 105 108 101 44 32 112 117
Process returned 0 (0x0)   execution time : 3.190 s
Press any key to continue.


¿No te sale eso, o no es lo que querías?

¡Un saludo!

apoeti

Vale... epic fail XD. El problema estaba en que lo había guardado con el mismo nombre que el programa erróneo en otra ubicación y estaba usando el erróneo.

El programa va perfecto.
Gracias a todos por vuestra ayuda.

Saludos.