[ Foro de C++ ]

Leer de fichero caracter a caracter

12-Nov-2007 18:48
Homer A. Ramos
6 Respuestas

Hola de nuevo!

Estoy intentando leer un fichero compuesto por los siguientes datos:

1A2E3I4O5U
6B7C8D9E10F
ETC...

El caso es que necesito leer caracter a caracter (primero el 1, luego la A, etc.) y con lo que has comentado en el curso no me ha quedado muy claro el sistema de lectura que tengo que utilizar. Tampoco me queda claro si mi fichero es tipo texto o qué, porque el tipo de extension que tiene es una inventada, llamada ".pra"

Me podríais ayudar?

13-Nov-2007 18:26
Nacho Cabanes (+31)

Lo importante no es la extensión del fichero, porque en muchos casos la extensión la elige el programador, abreviando alguna palabra que para él sea significativa.

El truco es mirar el fichero con cualquier visor/editor hexadecimal. Si todo son letras imprimibles, como en el ejemplo anterior, se trata de un fichero que podrás abrir como "modo texto" si quieres, y a partir de ahí, ir leyendo carácter a carácter, uno tras otro, de forma secuencial (no necesitarías ningún "seek").

En cualquier caso... ¿qué vas a hacer con el fichero cuando lo vas leyendo? Porque eso también es importante para saber cómo atacar...


17-Nov-2007 11:27
Homer A. Ramos

Gracias por tu contesta!

A ver, yo necesitaba leer el fichero para trabajar con cada uno de los caracteres que contenía. Al final logré leer cada uno haciendo un getline(fich, linea); Sabiendo que linea era un string comence a recorrerlo con un for hasta encontrar un caracter en blanco que representa el fin de linea.

Fui leyendo caracter a caraacter el string linea: linea[i]

Gracias!

17-Nov-2007 18:02
Homer A. Ramos

Aunque me quedo con la duda de como leer con un char un fichero. Es que el getline solamente es para string (por lo que he leido).
21-Nov-2007 13:03
Nacho Cabanes (+31)

Claro, el getline lee una línea de un fichero, y luego tú podrías analizar esa línea (string) letra a letra.

Si quieres leer letra a letra, podrías incluso usar >>, igual que con "cin":

#include <iostream>
#include <fstream>
using namespace std;

int main () {
 fstream ficheroEntrada;
 char letra;

 ficheroEntrada.open ("ficheroTexto.txt", ios::in);
 if (ficheroEntrada.is_open()) {
 while (! ficheroEntrada.eof() ) {
 ficheroEntrada >> letra;
 cout << letra << " ";
 }
 ficheroEntrada.close();
 }
 else cout << "Fichero inexistente" << endl;
 return 0;
}

El problema de hacerlo así es que se salta los espacios en blanco, así que si es un fichero de texto, es más razonable leer string a string y luego tú tratas cada string letra a letra.


02-Dec-2007 23:37
Sol enbum

El metodo getline siempre lo he visto muy util, ya que se usa para muchos casos. O incluso usando el operador ">>" como bien comenta Nacho.

Pero aquí, si lo que interesa es leer "siempre" un caracter (uno a uno), no sería mas recomendable usar el metodo get?
istream& get(char*, int len, char = '\n');
istream& get(char&); //siendo en el ejemplo ficheroEntrada.get(letra); 
La primera lee caracteres y los almacena en el buffer indicado en el primer parámetro hasta que se leen "len" caracteres o hasta que se encuentra el carácter indicado en el tercer parámetro, que por defecto es el retorno de línea.

La segunda forma extrae un único carácter en la referencia a char proporcionada.

(de conclase)


03-Dec-2007 01:20
Nacho Cabanes (+31)

Sí, el método "get" también es posiblemente la mejor forma si quieres leer exactamente un carácter cada vez.

Aunque en "el mundo real" es más frecuente leer bloques de información (por rapidez) que carácter a carácter, y procesarlo después.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)