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

problema al leer primer caracter y compararlo con otro

Estas en el tema de problema al leer primer caracter y compararlo con otro en el foro de C/C++ en Foros del Web. Hola, estoy empezando con c y c++ y tengo un problema que no consigo resolver. Quiero leer el primer carácter de un fichero y si ...
  #1 (permalink)  
Antiguo 26/10/2007, 04:44
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 19 años, 4 meses
Puntos: 0
problema al leer primer caracter y compararlo con otro

Hola, estoy empezando con c y c++ y tengo un problema que no consigo resolver. Quiero leer el primer carácter de un fichero y si es igual a "!" realizar otras operaciones.

Código:
      char firstch;
      FILE *input = fopen(argv[i],"r");
      firstch=getc(input);
      cout << "What gets: " << firstch << endl;
      cout << "What gets: " << &firstch << endl;

      if (&firstch == "!") {
          cout << "First char equal to !" << endl;
      }
      if (fclose(input)!=0) {
        printf("Error closing file\n");
      }
Estoy haciendo pruebas leyendo 3 ficheros, dos de ellos comienzan con ">" y otro con "!". Los resultados son estos:

What gets: >
What gets: >l

What gets: >
What gets: >l

What gets: !
What gets: !l

No detecta el último fichero que comienza con "!". Cuando cambio la comparacion de "if (&firstch == "!") {" por "if (firstch == "!") {" me aparece el siguiente error de compilación:

ISO C++ prohíbe la comparación entre puntero y entero
:: === Build finished: 1 errors, 0 warnings ===

Mi pregunta es cómo debo comparar el valor que lee el fichero con el carácter "!" para poder hacer otras operaciones? He leido manuales y cursos sobre C y C++ pero no entiendo muy bien porque no es posible ese tipo de comparaciones.

Un saludo y gracias de antemano.
  #2 (permalink)  
Antiguo 26/10/2007, 05:05
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 19 años, 4 meses
Puntos: 0
Re: problema al leer primer caracter y compararlo con otro

lo acabo de solucionar. Eran las comillas del ! en la comparacion, debe ser así:

if (firstch == '!') {
  #3 (permalink)  
Antiguo 26/10/2007, 15:26
 
Fecha de Ingreso: octubre-2007
Mensajes: 10
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: problema al leer primer caracter y compararlo con otro

Cita:
Iniciado por aLiSHa_FW Ver Mensaje
Código:
      char firstch;
      FILE *input = fopen(argv[i],"r");
      firstch=getc(input);
      cout << "What gets: " << firstch << endl;
      cout << "What gets: " << &firstch << endl;
firstch es un char. &firstch es una referencia a un carácter (o un puntero a carácter - hay diferencias sutiles entre C++ y C y mi campo de experiencia es más C que C++].

Cuando haces cout << &firstch, le estás suministrando lo que el compilador va a interpretar como una cadena.

Lo que va a pasar es que el compilador se va a ir a la posición de memoria donde esté firstch, y lo va a interpretar como el primer carácter de una cadena, y va a seguir leyendo hasta que se encuentre una posición de memoria a 0 (un caracter nulo, que es la marca de final de cadena). Ten cuidado, ya que tu programa está leyendo memoria (las posiciones siguientes a firstchr) que no has inicializado y pueden contener basura (los símbolos raros que ves y que se imprimen hasta que en un momento te topas con una posición de memoria a 0 y fallas). Si tienes muy mala suerte, las posiciones siguientes a firstchr podrían no estar reservadas para tu programa y, en ese caso, tu programa daría "core" (o una ventanita de error no recuperable en Windows).

Cita:
Código:
      if (&firstch == "!") {
          cout << "First char equal to !" << endl;
      }
Aquí hay varios asuntos, y no todos son fáciles. La aritmética de punteros, las referencias, etc. no lo son.

Cuando haces &first en C++, si no me falla la memoria, estás creando una referencia a un carácter, que el compilador trata como un entero (los carácters, o char, pueden ser "promocionados" a entero por un compilador sin problemas). Por lo tanto, falla al comparar el entero &first con la cadena (puntero a char) "!", y ese es el error que ves.

Podrías pensar, bueno, pero en la posición de memoria de firstch tengo el carácter "!", sólo tengo que hacer algo así

Código:
if((char*)&firstch=="!")
Pero eso no vale, ya que el operador == compara que los dos punteros sean iguales, o sea que apunten al mismo sitio, no que el contenido sea igual. Tienes funciones, como strcmp para comparar el contenido de dos punteros a char que representan carácter.

Entonces, ¿vale esto?

Código:
if(strcmp((char*)&firstch,"!"))
La respuesta es aún: no. Y no vale porque "!" es una cadena perfectamente válida, acabada en 0, pero lo que tu tienes en firstch no lo es - tienes en su posición de memoria un carácter "!" pero el siguiente carácter no es 0, sino que es porquería (y de hecho, lo ves al hacer el cout << &firstch). La comparación no va a servir.

Sin embargo, cuando haces

Código:
if(firstch=='!')
estás comparado dos caracteres, y no dos cadenas, y eso es perfectamente válido.

Todo esto es muy complicado, pero para resumir

a) No es lo mismo una cadena de caracteres que un caracter solo, y no se puede convertir el caracter a una cadena, ya que le falta la marca de final de cadena (\0)

b) La función getch devuelve un carácter, no una cadena, por lo tanto tienes que usar comparación de carácter.

c) La comparación == entre punteros no compara el contenido de los punteros, si no que apunten al mismo sitio. Con cadenas, casi siempre quieres comparar el contenido, no que ambas cadenas están en la misma posición de memoria.

d) El compilador asume que " y ' son cosas distintas. Algo encerrado entre dobles comillas (") es una cadena de texto, que se representa normalmente por un puntero a char al primer carácter de la cadena. Sin embargo, lo encerrado por comillas simples (') es un caracter [1]

Estoy casi dormido, espero que esta respuesta sea útil :)

[1] El compilador trata '!' como un entero y no como un char, pero esa es otra historia y no añade mucha luz a esta discusión.
  #4 (permalink)  
Antiguo 29/10/2007, 03:19
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 19 años, 4 meses
Puntos: 0
Re: problema al leer primer caracter y compararlo con otro

Muchas gracias por la explicación. Ahora, aparte de que funciona, entiendo el porqué.

Un saludo.
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 18:07.