• Sábado 27 de Abril de 2024, 18:56

Autor Tema:  Ayuda Con Getchar()  (Leído 2164 veces)

tglaria

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Ayuda Con Getchar()
« en: Miércoles 29 de Junio de 2005, 21:45 »
0
estoy haciendo un prog que debe contar el nùmero de letras provenientes de un documento de texto ("texto.txt"). el problema es que al correr el programa, el getchar me retorna valores distintos a los que correponden usando la funcion printf a pantalla.

por ejemplo:
Código: Text
  1.  
  2. #include <stdio.h>
  3. void main (void)
  4. {
  5. printf("1.-%c <-> 2.-%c",225, 160);
  6. getchar();
  7. }
  8.  

imprime:
         1.-ß <-> 2.-á
correspondiendo ß al valor 225, y á al valor 160.

Sin embargo, según este código:
Código: Text
  1.  
  2. #include &#60;stdio.h&#62;
  3. void main (void)
  4. {
  5. FILE *salida;
  6. salida= fopen(&#34;salida.txt&#34;, &#34;w+&#34;);
  7. fprintf(salida, &#34;1.-%c &#60;-&#62; 2.-%c&#34;,225, 160);
  8. }
  9.  

escribe en el archivo "salida.txt":
       1.-á <-> 2.-
correspondiendo 'á' al valor 225, y .... a 160.




¿Podría alguien explicarme qué pasa y decirme qué valores toman las letras a lvenir de un archivo?

PD: trabajo en Win2K

Nagisa

  • Miembro MUY activo
  • ***
  • Mensajes: 119
  • Nacionalidad: es
    • Ver Perfil
Re: Ayuda Con Getchar()
« Respuesta #1 en: Sábado 2 de Julio de 2005, 14:16 »
0
Hola!! Realmente es algo raro, pero a mi tb me pasa. La explicacion podria estar en los juegos de caracteres usados por la  E/S de C y Windows. Te explico:

Si trasteas un poco mas con tus ejemplos, y rediriges la salida del que te saca los valores por pantalla a un fichero, veras que el resultado obtenido es el mismo que cuando lo sacas directamente por fichero. lo mismo pasa si aunque uses la llamada fprintf en lugar de llevarlo al fichero lo llevas a stdout(salida standard: pantalla) tb es igual que cuando usas fprintf a secas.

Mirando un poco por internet, se puede suponer que para las salida a perifericos se usa ASCII y para las de fichero se usa Unicode. Ambos tienen caracteres comunes hasta el 127, pero a partir del 128 son distintos.

La lectura si la haces desde fichero deberia de ser en Unicode, pero si lo sacas por pantalla sera en ASCII. Solucion : sacar tus resultados en otro ficheros llamada cuenta (o algo asi).

Te dejo referencias a ambos juegos para que los ojees:

UNICODE (128-255)

ASCII (128-255)

Salu2!!  :hola:
   

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Ayuda Con Getchar()
« Respuesta #2 en: Sábado 2 de Julio de 2005, 14:39 »
0
Las cadenas en C se suelen escribir en ASCII, que va de 0 a 127. El extendend ASCII (que no es 100% standard como ASCII) va de 128 a 255.

http://www.lookuptables.com/

Unicode es otra forma de representar cadenas, mucho mas avanzada ya que permite practicamente los caracteres de cualquier idioma, ocupa 2 bytes cada caracter en vez de uno y es el que utiliza Windows internamente. Los 128 primeros caracteres de Unicode son equivalentes a los de ASCII pero no se almacenan igual.

Cadena HOLA en ASCII:
72,79,76,65
Cadena HOLA en Unicode:
72,0,79,0,76,0,65,0

http://www.unicode.org/


Con respecto a tu problema esos caracteres no son standard en ASCII y entonces como bien dice Nagisa podes tener diferentes outputs dependiendo del codigo de pagina usado. Si queres tener mas caracteres te recomiendo usar Unicode pero si en realidad estabas por hacer algo con datos binarios no hay ningun problema.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

tglaria

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Ayuda Con Getchar()
« Respuesta #3 en: Sábado 2 de Julio de 2005, 22:22 »
0
Citar
Nagisa:
Solucion : sacar tus resultados en otro ficheros llamada cuenta (o algo asi).

no entiendo a qué te refieres con eso.

el fichero de entrada es un documento de texto (estos escritos con el notepad) y tenía entendido que se usaba el ascii para guardar los datos en ellos (pero parece que no, y eso que al guardar el archivo le digo que lo guarde como ANSI).
Haré la prueba en unix o DOS aver qué pasa.

 La idea del programa es contar las palabras del fichero y luego escribir, en otro archivo, cuantas veces aparece cada palabra (tomando "AVIÓN" como la misma palabra que "avión" o "aViÓn", etc).

Muchas gracias por sus respuestas, fueron de bastante ayuda.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Ayuda Con Getchar()
« Respuesta #4 en: Sábado 2 de Julio de 2005, 22:58 »
0
Cita de: "tglaria"
el fichero de entrada es un documento de texto (estos escritos con el notepad) y tenía entendido que se usaba el ascii para guardar los datos en ellos (pero parece que no, y eso que al guardar el archivo le digo que lo guarde como ANSI).
Si le das a Save as (guardar como) en el notepad vas a ver un combobox llamado Encoding con cuatro opciones, la que se usa por defecto y casi siempre ANSI, Unicode, Unicode Big Endian, y UTF-8. Seguramente el texto esta en ANSI y el problema es el codigo de pagina.

 :whistling:  :smartass:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Pris

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Ayuda Con Getchar()
« Respuesta #5 en: Viernes 15 de Julio de 2005, 04:57 »
0
Tienen razón por arriba, yo uso linux y he compilado los dos códigos y obtengo el mismo resultado en ambos tanto por pantalla como en el archivo de texto que corresponden a tu segunda opción:
1.-á <-> 2.-
y eso es pq en unicode el 160 corresponde a un desplazamiento hacia atrás, el 255 corresponde a á.