[ Foro de C# ]

Leer cadenas con ReadString (Ejemplo77)

22-Mar-2010 10:03
Jesús S.
1 Respuestas

¡Hola!

He modificado el 'Ejemplo77' para leer 'String' en vez de 'Byte', así:


        try
            {
            fichero = new BinaryReader(File.Open(nombre, FileMode.Open));
            dato = fichero.ReadString();
            Console.WriteLine("La cadena leída es: \n{0}", dato);
            fichero.Close();
         }


Al correrlo para leer un archivo de texto se come la primera letra, y luego lee del orden de 62 caracteres.

Si lo hago con un fichero 'jpg' me avisa 'No se puede leer más allá del final de la secuencia'.

¿Hay que tomar alguna precaución para usar 'ReadString'?.

Saludos.


31-Mar-2010 19:26
Nacho Cabanes (+83)

Decías

¿Hay que tomar alguna precaución para usar 'ReadString'?.


Sí. No lee cualquier cadena de texto, sino un "string" al estilo de C#, por lo que sólo deberías usarlo después de haber guardado el string en un BinaryWriter.

En cualquier otro caso (ficheros de texto generales), no deberías usar el ReadString de un fichero binario, sino abrir como fichero de texto y usar ReadLine.

La idea es que nada te garantiza que un "string" se guarde como texto puro, ni que termine con un avance de línea. No sé como almacena internamente un string en el caso de C#, pero te pongo otros dos casos que te ayudarán a entenderlo:

- En C, las cadenas se guardan como una secuencia de caracteres terminada en un carácter nulo.

- En Pascal, en un primer byte se guarda la longitud, y luego se almacena la secuencia de caracteres, sin ningún terminador especial.

Por ello, ninguno de los dos lenguajes te generararía un fichero de texto puro (ni podrías leer texto puro de un fichero binario que contenga cadenas), y las cadenas que un lenguaje guarda en fichero no se podrían leer de forma trivial desde el otro, sino que habría que analizarlas byte a byte.

Lo mismo ocurre con ReadString en C#: sólo funcionará correctamente si lees una cadena creada con el Write de un BinaryReader, pero no en los demás casos.






(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.)