Ayudilla para archivos C#

Iniciado por Kaxperday, 17 Abril 2015, 20:47 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Código (csharp) [Seleccionar]
StreamReader reader = new StreamReader(directorio + "\\Temas.txt");
               StreamReader readel = new StreamReader(directorio + "\\Respuestas.txt");

               if (aleatoriedad == 1)
               {
                   int i=0;
                   while (reader.Peek()>=0)
                   {
                       linea = reader.ReadLine();
                       mensaje = readel.ReadLine();
                       if(mensaje=="")//reinicia el puntero al inicio
                       {
                           readel.BaseStream.Position = 0;
                           readel.DiscardBufferedData();
                       }
                       MessageBox.Show("LINEA: "+linea+ "MENSAJE: "+mensaje);
                   }
                   reader.Close();
                   readel.Close();


La primera iteracion lee la primera linea de los archivos correctamente, pero luego no funciona ¿?? que pasa, es horrible programar para archivos en C#, luego se quejan de C.

Gracias socios.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

jaxoR

#1
Código (csharp) [Seleccionar]
while (reader.Peek()>=0)

----------->

Código (csharp) [Seleccionar]
while ((reader.Peek() != -1))
{
   linea = reader.ReadLine();
   using (StringReader sr = new StringReader(linea))
   {


Yo siempre lo trabajé así. Prueba!

kub0x

Mejor comprueba la propiedad "EndOfStream" del objeto StreamReader ya que nos indica si llegamos al EOF o final del archivo.

Código (csharp) [Seleccionar]

while (!reader.EndOfStream) //Mientras no hayamos llegado al final del archivo
   Console.WriteLine(reader.ReadLine()); //Imprimos una línea


Cita de: Kaxperday en 17 Abril 2015, 20:47 PM
es horrible programar para archivos en C#, luego se quejan de C.

Perdona grrr pero no hables sin saber ;D En C todo es más primitivo, otra cosa sería C++ aun así comparándolo con C# es inferior en funcionalidad nativa o "por defecto" ya que el Framework te abstrae de muchos procesos que en C++ no están implementados (se arregla descargando libs de terceros o implementando dichas funcionalidades tu mismo). Ojo que programo más en C++ que en .NET (VB/C#) pero C# por defecto te trae una gran cantidad de librerías directas para usar ;)

Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


Eleкtro

#3
Cita de: Kaxperday en 17 Abril 2015, 20:47 PMes horrible programar para archivos en C#, luego se quejan de C.

¿Te das cuenta que basas tu crítica en el desconocimiento del lenguaje?, no es cierto lo que dices, para ti es "horrible" solamente por que no sabes cómo hacerlo, eso no significa que sea más dificil que en C/C++, y además, hay formas más simples para leer un archivo de cómo lo estás intentando, pero no puedo mostrártelo sin saber exactamente que intentas hacer con 2 archivos al mismo tiempo.

Si quieres leer un archivo de principio a fin, linea por linea, en lugar de basar tu evaluación en el siguiente caracter, utiliza el loop para evaluar la propiedad StreamReader.EndOfStream

Código (csharp) [Seleccionar]
string themFilepath = Path.Combine(dirPath, "Temas.txt");
string respFilepath = Path.Combine(dirPath, "Respuestas.txt");

string themLine = string.Empty;
string respLine = string.Empty;

StreamReader themSR = new StreamReader(themFilepath);
StreamReader respSR = new StreamReader(respFilepath);

while (!(themSR.EndOfStream)) {

   themLine = themSR.ReadLine;
   respLine = respSR.ReadLine;

   // ...

}








Kaxperday

#4
Bueno gracias por las respuestas, si antes lo tenia asi con el EndOfStream, estuve cambiando bastante código y pensé que era fallo del bucle por eso lo cambie.

Mirad!!! Me pasa una cosa muy curiosa, como pensaba que el fallo que os voy a explicar ahora era tema del StreamReader hice el siguiente code:

Código (csharp) [Seleccionar]

FileStream readerTemas = new FileStream(directorio + "\\Temas.txt", FileMode.Open, FileAccess.Read);
           FileStream readerRespuestas = new FileStream(directorio + "\\Respuestas.txt", FileMode.Open, FileAccess.Read);do
               {
                   Random r = new Random(DateTime.Now.Millisecond);
                   URL = ""; respuesta = "";
                   do
                   {
                       caracter = (char)(byte)readerTemas.ReadByte();
                       if (caracter == '\n')
                           break;
                       URL += caracter;
                   } while (caracter != '\n');
                   do
                   {
                       caracter = (char)(byte)readerRespuestas.ReadByte();
                       if (caracter == '\n')
                           break;
                       respuesta += caracter;
                   } while (caracter != '\n');

                   MessageBox.Show("url: " + URL + Environment.NewLine + "respuesta:" + respuesta);


Y bien es gracioso, funciona igual que lo hacía el streamreader, con el fallo igual.

La primera ejecucion muestra la primera linea de cada archivo, la segunda muestra nada en URL, y en respuesta si hay contenido, la tercera muestra contenido en URL (el de la segunda linea) y hay contenido en respuesta respectivo a su iteracion del bucle, la cuarta URL no muestra nada, y respuesta sigue mostrandose de acuerdo a su linea.

En fin Temas.txt recoge el contenido de la linea solo en las interacciones impares, y en Respuestas.txt funciona con normalidad WTF, este error lo llevaba arrastrando de tiempo y no sabia como solucionarlo, por eso deje de lado el StreamReader y pase a filestream pero ocurre igual.

El archivo solo se usa ahi para lectura, las demas veces que se una se cierra bien y su contenido con lineas con urls, pero al leer solo le lee en impares no se porque  :rolleyes: :rolleyes: :-*

Con el streamreader para solucionar ese error hice lo siguiente:

Código (csharp) [Seleccionar]

while (!reader.EndOfStream)
                {
                    j++;
                    if (j % 2 == 0)
                    {
                        linea = reader.ReadLine();
                        linea = reader.ReadLine();
                    }
                    else
                    {
                        linea = reader.ReadLine();
                    }
                    mensaje = readel.ReadLine();
                    if (linea == "" || mensaje == "")
                    {
                        break;
                    }


edito: en lo de C# que es dificil y tal que es mejor C, pues que queréis que os diga mirad como se abre un fichero en C 2 lineas, y en C# tambien 2 lineas pero otros tantas opciones y instancias para abrirlos que lo hacen muy engorroso todo, si fuese C no tendría estos probleas, puede que sea por desconocimiento, pero eso de using, buffers.... en fin para mi lo hace muy complejo aunque mas completo.

Gracias por estar ayudando gente <3
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.