2012-08-16 31 views
6

El archivo testing.res tiene 240 MB de tamaño. Quiero leerlo. Pero estoy consiguiendo el error en esta línea:Estoy recibiendo un error No puedo leer más allá del final de la secuencia ¿por qué?

int v = br.ReadInt32(); 

EndOfStreamException No se puede leer más allá del final de la secuencia

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      R(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     public void R() 
     { 
      using (var br = new System.IO.BinaryReader(File.Open(@"d:\testing.res", FileMode.Open))) 
      { 
       // 2. 
       // Position and length variables. 
       int pos = 0; 
       // 2A. 
       // Use BaseStream. 
       int length = (int)br.BaseStream.Length; 
       while (br.BaseStream.Position < length) 
       { 
        // 3. 
        // Read integer. 
        int v = br.ReadInt32(); 
        textBox1.Text = v.ToString(); 
       } 

      } 
     } 
    } 
} 

La excepción:

System.IO.EndOfStreamException was unhandled 
    Message=Unable to read beyond the end of the stream. 
    Source=mscorlib 
    StackTrace: 
     at System.IO.BinaryReader.FillBuffer(Int32 numBytes) 
     at System.IO.BinaryReader.ReadInt32() 
     at WindowsFormsApplication1.Form1.R() in D:\C-Sharp\BinaryReader\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 41 
     at WindowsFormsApplication1.Form1..ctor() in D:\C-Sharp\BinaryReader\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 19 
     at WindowsFormsApplication1.Program.Main() in D:\C-Sharp\BinaryReader\WindowsFormsApplication1\WindowsFormsApplication1\Program.cs:line 18 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

Esta respuesta me había ayudado cuando estaba recibiendo el mismo error: https://stackoverflow.com/questions/23865865/reading-xls-stream-with-getresponsestream-and-spreadsheetdocument-open – gabics

Respuesta

3

Uno de los motivos por los que el código podría fallar es si el archivo contiene bytes adicionales (es decir, un archivo de 7 bytes de longitud). Su código se disparará en los últimos 3 bytes.

Fijar - considere número de enteros de cómputo de antemano y utilizando for para leer:

var count = br.BaseStream.Length/sizeof(int); 
for (var i = 0; i < count; i++) 
{ 
    int v = br.ReadInt32(); 
    textBox1.Text = v.ToString(); 
} 

Tenga en cuenta que este código simplemente ignorar últimos 1-3 bytes si están allí.

+0

Alexei Levenkov probé tu código y terminé con el resultado: -1325399654 eso es lo que vi en el cuadro de texto1. ¿Podría ser de un archivo de 200mb? –

+0

@DanielLip, ¿Qué pasa con -1325399654? ¿Qué esperas? Es un poco difícil de discutir si es mejor o peor que 42 o 13. –

+0

Alexei necesito extraer los archivos de este archivo gigante de 200 MB. Es por eso que pensé que el tamaño de archivo de 200 mb daría más números. Pero supongo que tienes razón, simplemente no sé qué hacer con estos números que tengo. –

4

Usted debe utilizar una más fiable forma de averiguar cuándo se encuentra al final de la secuencia, en lugar de hacer rodar su propio contador con sizeof(int). Su método puede no ser lo suficientemente preciso, y el hecho de que esté usando un código inseguro para eso tampoco es demasiado bueno.

Una sonda manera si usted está en el extremo de la corriente o no es utilizar el PeekChar método:

while (br.PeekChar() != -1) 
{ 
    // 3. 
    // Read integer. 
    int v = br.ReadInt32(); 
    textBox1.Text = v.ToString(); 
} 

Una solución más común es escribir el número de int s que va a guardar en una archivo binario en frente de la lista real de enteros. De esta forma, sabrá cuándo detenerse sin depender de la longitud o la posición de la transmisión.

+0

dasblinkenlight im conseguir el mismo error. Acabo de actualizar mi pregunta con el código utilizando su solución de muestra, pero obtengo la misma excepción de error. –

+0

@DanielLip Sospeché que el método no sería lo suficientemente confiable. Pruebe el código de la actualización para ver si mejora, aunque fallaría si el número de bytes en su archivo binario no es divisible por el tamaño de 'Int32' en el disco. – dasblinkenlight

Cuestiones relacionadas