C++: Duda, Alternativa al IF:eof()

Iniciado por fuenteRea, 16 Octubre 2010, 02:34 AM

0 Miembros y 2 Visitantes están viendo este tema.

fuenteRea

Hola,

estoy leyendo de un fichero, en el momento en que leo la última línea, necesito hacer una operación, pero claro, no me lo permite porque la función eof() necesita una lectura adelantada, es decir, primero leo y después si hemos llegado al final salgo.

No sé si me he explicado bien, voy a poner mejor el código.

lista_procesos.inicio();
while(!lista_procesos.fin()){
      lista_procesos.consultar(d);
      if(((!d.ejecutado)||((d.ejecutado)&&(d.estado==preparado)))&&(!IF.eof())){
         d.tiempo_espera++;
         lista_procesos.borrar();
         lista_procesos.insertar(d);
      }
      lista_procesos.avanzar();
}

Quería que justo cuando haya llegado al final no haga eso, pero claro, el eof() necesita una lectura adelantada que si la hago me cargo el algoritmo. ¿Existe alguna función que haga justo lo que necesito?.

Un saludo!!
PD: Estoy desesperadisimo ya. jeje
Una rosa es una rosa...

Oblivi0n

No entiende lo que dices, quieres cuando el programa haga la comparacion del if, compruebe si IF es = EOF  o no?

fuenteRea

hola,

si, el problema esta en que cuando ha leido la última línea completa si llamo a la funcion eof() me devolverá false, porque no sabe que en la siguiente línea se termina el fichero. Para que me devolviera true tendría que llamar a getline, pero si lo hago, me cargo el algoritmo. necesitaría una función que haga lo mismo que eof() pero sin necesitar antes la llamada al getline.

un saludo!!
Una rosa es una rosa...

do-while

¡Buenas!

La solucion la veo bien sencilla.


Leer fichero

Si no fin fichero
{
    ejecutas lo que quieras
}
Sino
{
    Acciones en caso de alcanzar fin fichero.
}


Tan sencillo como esto.

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

fuenteRea

Vuelvo a repetir porque no sé si es que me explico muy mal o es que no se me lee xD que desastre!!

Cita de: do-while en 17 Octubre 2010, 07:05 AM
¡Buenas!

La solucion la veo bien sencilla.


Leer fichero

Si no fin fichero
{
    ejecutas lo que quieras
}
Sino
{
    Acciones en caso de alcanzar fin fichero.
}


Tan sencillo como esto.

¡Saludos!

eso no se puede hacer, y te explico por qué

Imaginemos que tenemos un fichero con una línea de datos que queremos recuperar.

Sin leer la línea--> LLamamos a la función eof() y nos devuelve false, como es normal.

Leemos la primera línea, primera y única. Llamamos al getline y a continuación llamamos a eof() y nos devuelve FALSE!!!! porque necesita una lectura más. es decir:

Si intentamos leer una nueva línea como no hay ahora es cuando eof devuelve TRUE.

¿Tan dificil es entender lo que digo?
un saludo!!
Una rosa es una rosa...

BOFH

Para leer un carácter sin consumirlo se utiliza el método peek() de la clase istream.

Más info: http://www.cplusplus.com/reference/iostream/istream/peek/

Un saludo.

do-while

Cita de: thedoctor77 en 17 Octubre 2010, 13:38 PM
Vuelvo a repetir porque no sé si es que me explico muy mal o es que no se me lee xD que desastre!!

eso no se puede hacer, y te explico por qué

Imaginemos que tenemos un fichero con una línea de datos que queremos recuperar.

Sin leer la línea--> LLamamos a la función eof() y nos devuelve false, como es normal.

Leemos la primera línea, primera y única. Llamamos al getline y a continuación llamamos a eof() y nos devuelve FALSE!!!! porque necesita una lectura más. es decir:

Si intentamos leer una nueva línea como no hay ahora es cuando eof devuelve TRUE.

¿Tan dificil es entender lo que digo?
un saludo!!

¬¬

Revisa el pseudo que te he dejado y comprueba que es lo que hace con el ejemplo que me has puesto


Leer fichero //cargo la linea del fichero

EOF?
No -> Proceso la informacion

//Ahora ya no queda informacion en el fichero
Leer fichero //No hay informacion y se activa EOF

EOF?
Si -> Las acciones que quieras


¿No era tan complicado no? Si leer lo que ponen los demas tampoco cuesta tanto.

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

fuenteRea

#7
Hola,

voy a dejar este tema porque creo que no se me entiende.

Vamos a ver la función eof() necesita una lectura adelantada.

Es decir si recupero la ultima linea de un fichero, a menos que intente recuperar otra, la función eof() va a seguir devolviendo false.

Repito no puedo hacer esa lectura porque me cargo el algoritmo. Por favor, entiendelo.

La otra solución sería hacerlo una vez terminada la lectura, pero no puede ser porque me modifica ciertos atributos de ciertos objetos que no quiero que los haga ahi, si no antes, justo cuando lea la última línea. y con el dato de la última línea solamente.

si hago el if else que propones, no tiene sentido, ya que estaría en el problema anteriormente mencionado y repetido 3 veces. Si hago el if else cuando llegue al else me va a modificar todos los procesos, y solo quiero que me modifique el de la última línea del fichero. y no puedo poner otra condición porque el fichero puede tener 1, 2 ,3 etc líneas. Y no puedo comparar con nada puesto que los procesos pueden ser identicos.

No se si ya queda más claro.

PD gracias de todas maneras, es complicado, creo que tendré que replantearme el código y ya está.

un saludo!!
Una rosa es una rosa...