[C con Clase] Leer fichero de texto con "formato".

Steven Davidson srd4121 en njit.edu
Jue Mayo 6 13:07:42 CEST 2010


Hola Jorge,

2010/5/6 Jorge Vega Sanchez <memmaker650 en gmail.com>

> A ver si lo explico bien. Tengo un par de programitas de prueba, en uno
> escribo texto en un fichero con saltos de linea. Todo funciona
> perfectamente.
> Ahora en el programa que debe leer el fichero y mostrarlo por pantalla no
> consigo que se representen los espacios y los saltos de linea.
>
> Esto es lo que tengo, a ver si me podeis ayudar porque ando que ya no sé
> que probar.
>


Veamos el código fuente.



> #include <iostream>
> #include <fstream>
> //#include <stdio.h>
>
> using namespace std;
>
> int main(int argc, char *argv[])
> {
>   /* Declaramos un array con suficiente tamaño para leer las líneas */
>        char cadena[100];
>   /* Fichero original, se abre para lectura pasando parámetros en la
> declaración de la variable */
>   ifstream f;
>   f.open("fichero2.txt", ifstream::in);
>
>   /* Comprobar que se abierto correctamente */
>   if (!f)
>   {
>                cout << "fallo" << endl;
>                return -1;
>        }
>        /* Hacemos una primera lectura */
>        while (!f.eof())
>        {
>                /* Leemos la siguiente línea */
>                f >> cadena;
>


Aquí está el problema. Estás leyendo la información con formato. La
operación de extracción >> saltará los espacios blancos: ' ', '\t', '\n',
'\r', '\f', y '\v'. Si quieres leer la información exactamente en el
fichero, entonces usa 'read()'. Sin embargo, en tu caso, puedes usar
'getline()' sin muchos problemas. Por ejemplo,

cin.getline( cadena, 100 );



>                if(cadena=='\n')
>


Esto es incorrecto. No puedes comparar una cadena con un carácter. Lo que
realmente estás haciendo es comparar la dirección de memoria del primer
carácter de la cadena con el código ASCII del carácter '\n'.

De todas maneras, esta comparación ya no es necesaria.


>                {
>                        cout << endl;
>                }
>                else
>                {
>                        cout << cadena;
>                }
>        }
>        cout << endl;
>        f.close();
>        return 0;
> }
>
>
Espero haber aclarado las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100506/f7cb99b1/attachment.html>


Más información sobre la lista de distribución Cconclase