none
Lectura de archivo secuencial

    Pregunta

  • Hola a todos,

    He creado un archivo secuencial de varios cientos de caracteres y ahora pretendo leerlo de forma secuencial a golpe de 99 caracteres por cada lectura,pero no hay forma,ya que no me lee nada.

    (El archivo secuencial lo generé con la instruccion Print)

    Cual es la instruccion equivalente de lectura al Print?

    Alguien sabe que puede estar pasando?

    Public Class Form1
        <VBFixedString(99)> Dim StringLecturaArchivo As String

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim j As Long
            FileOpen(1, "T:\Prueba.txt", OpenMode.Binary, OpenAccess.Read, OpenShare.Shared)
            For j = 1 To 10
                FileGet(1, StringLecturaArchivo, 99)
                MsgBox("El string leido es " & StringLecturaArchivo)
            Next
            FileClose(1)

        End Sub
    End Class

    martes, 30 de abril de 2013 21:49

Respuestas

  • Dim pathSource As String = "c:\tests\source.txt"
        Try
            Using ( fsSource As FileStream = New FileStream(pathSource,
                FileMode.Open, FileAccess.Read))
           
                // leer array de 99  bytes.
                Dim bytes As Byte() = New Byte(99)
                Dim numBytesToRead As Integer = 99
                Dim numBytesRead As Integet = 0
                While (fsSource.Read(bytes, numBytesRead, numBytesToRead) > 0)
               

    ' hacer lo que sea.

    Dim s As String = System.Text.Encoding.Default.GetString(bytes)

    End While

    End Using

    Catch ioEx As FileNotFoundException)

    Console.WriteLine(ioEx.Message)

    End Try



    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos






    • Editado Sergio Parra miércoles, 01 de mayo de 2013 18:46
    • Marcado como respuesta jorge234 miércoles, 01 de mayo de 2013 23:58
    miércoles, 01 de mayo de 2013 7:22

Todas las respuestas

  • Si no es necesario que los leas de 99 en 99 caracteres, puedes hacer esto:

        Dim sr As System.IO.StreamReader
        Try
          sr = New System.IO.StreamReader("C:\andesea\loquesea.txt")
          TextBox1.Text = sr.ReadToEnd
        Catch ex As Exception
          MsgBox(ex.Message)
        Finally
          If sr IsNot Nothing Then
            sr.Close()
          End If
        End Try

    Leerlo de 99 en 99 caracteres es más problemático, ya que al intentar leer los últimos 99 puede producirse un error si hay menos.


    "Option Strict On" no es opcional, es necesario.

    martes, 30 de abril de 2013 22:19
  • Gracias Carlos por responder,

    La idea es hacer el menor numero de lecturas posibles.pero tambien tengo que tener en cuenta que son miles de caracteres y un string no puede tener mas de 64K caracteres,y el archivo puede tener miles de caracteres.

    Lo que no entiendo es por qué no lee nada en el ejemplo que he puesto.

    Hay algunas otras instrucciones para leer un archivo secuencial?

    Saludos

    martes, 30 de abril de 2013 23:10
  • En ese caso el método ReadLine te viene como anillo al dedo.

    En la pagina de MSDN de StreamReader precisamente viene un ejemplo casi al final en el que usan el método ReadLine:

    StreamReader (Clase)


    "Option Strict On" no es opcional, es necesario.

    martes, 30 de abril de 2013 23:32
  • No me vale el ReadLine porque en la ristre de caracteres el caracter <CR><LF>puede estar en cualquier sitio,aunque he pensado sustituir el <CR><LF> por un numero distinto fuera del conjunto de caracteres que se genera en dicho archivo.

    Ademas,vuelvo a tener el mismo problema ya que el string no puede ser mayor de 64K caracteres,con lo cual tendria que esribir en el archivo a trozos.

    Saludos

    miércoles, 01 de mayo de 2013 0:03
  • Siempre puedes leer de uno en uno:

        Dim sr As System.IO.StreamReader
        Dim todo As New System.Text.StringBuilder
        Dim texto As String = ""
        Try
          sr = New System.IO.StreamReader("C:\andesea\loquesea.txt")
          While sr.Peek >= 0
            todo.Append(Convert.ToChar(sr.Read))
          End While
        Catch ex As Exception
          MsgBox(ex.Message)
        Finally
          If sr IsNot Nothing Then
            sr.Close()
          End If
        End Try
        texto = todo.ToString
    He usado la clase stringBuilder porque el rendimiento es muy superior a la de la clase string


    "Option Strict On" no es opcional, es necesario.

    miércoles, 01 de mayo de 2013 0:16
  • Dim pathSource As String = "c:\tests\source.txt"
        Try
            Using ( fsSource As FileStream = New FileStream(pathSource,
                FileMode.Open, FileAccess.Read))
           
                // leer array de 99  bytes.
                Dim bytes As Byte() = New Byte(99)
                Dim numBytesToRead As Integer = 99
                Dim numBytesRead As Integet = 0
                While (fsSource.Read(bytes, numBytesRead, numBytesToRead) > 0)
               

    ' hacer lo que sea.

    Dim s As String = System.Text.Encoding.Default.GetString(bytes)

    End While

    End Using

    Catch ioEx As FileNotFoundException)

    Console.WriteLine(ioEx.Message)

    End Try



    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos






    • Editado Sergio Parra miércoles, 01 de mayo de 2013 18:46
    • Marcado como respuesta jorge234 miércoles, 01 de mayo de 2013 23:58
    miércoles, 01 de mayo de 2013 7:22
  • Gracias Sergio por responder,pero me resulta dificil adaptar tu ejemplo en supongo VB NO .net a VB 2008 y no logro probarlo.Si lo pudieras poner en VB 2008 te lo agradeceria.

    En cuanto a ti Carlos,el ejemplo que pones,no tiene errores pero no me lee nada y tampoco da error.Le he puesto un MsgBox al final para que me visualize lo leido y me aparece en blanco lo leido.

    Gracias y saludos

    miércoles, 01 de mayo de 2013 17:35
  • Perdona Jorge,lo escribí en c# he editado el código


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    miércoles, 01 de mayo de 2013 18:43
  • Crea un archivo de texto con el notepad por ejemplo, agregale algo y verifica el código, no sea que tu archivo esté corrupto y ese sea el problema

    "Option Strict On" no es opcional, es necesario.

    miércoles, 01 de mayo de 2013 19:23