powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / VB.NET побайтовое чтение из файла
5 сообщений из 5, страница 1 из 1
VB.NET побайтовое чтение из файла
    #38533446
Фотография surbanec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте форумчане. необходимо произвести побайтовое чтение из файла, бинарного, текстового - не суть важно. проблема с установкой положения чтения. вот код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    Dim j As Integer
        Dim b As Byte
        Dim RetStr As String = ""
        Dim bs() As String
        j = FreeFile()
        Dim allfile As Long = FileLen("C:\f.txt")
        ReDim bs(allfile - 1)
        FileOpen(j, "C:\f.txt", OpenMode.Random)
        For i As Long = 1 To allfile
            Seek(j, i)
            FileGet(j, b, 1)
            bs(i - 1) = Chr(b)
            b = 0
        Next
        FileClose(j)
        RetStr = Join(bs, "")
        Me.TextBox1.Text = RetStr


В итоге seek как будто не работает. считывается n-ое количество раз 1 символ файла.( помогите исправить ошибку
...
Рейтинг: 0 / 0
VB.NET побайтовое чтение из файла
    #38533552
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
surbanec, здесь не нужно побайтовое чтение. Весь код заменяется одной строкой:
Код: vbnet
1.
Dim RetStr As String = System.IO.File.ReadAllText("C:\f.txt")
...
Рейтинг: 0 / 0
VB.NET побайтовое чтение из файла
    #38533567
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
surbanec,


surbanecЗдравствуйте форумчане. необходимо произвести побайтовое чтение из файла, бинарного, текстового - не суть важно. проблема с установкой положения чтения. вот код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    Dim j As Integer
        Dim b As Byte
        Dim RetStr As String = ""
        Dim bs() As String
        j = FreeFile()
        Dim allfile As Long = FileLen("C:\f.txt")
        ReDim bs(allfile - 1)
        FileOpen(j, "C:\f.txt", OpenMode.Random)
        For i As Long = 1 To allfile
            Seek(j, i)
            FileGet(j, b, 1)
            bs(i - 1) = Chr(b)
            b = 0
        Next
        FileClose(j)
        RetStr = Join(bs, "")
        Me.TextBox1.Text = RetStr



В итоге seek как будто не работает. считывается n-ое количество раз 1 символ файла.( помогите исправить ошибку
откуда вообще выдран этот код?

Код: c#
1.
var RetStr = System.IO.File.ReadAllBytes("C:\f.txt");
...
Рейтинг: 0 / 0
VB.NET побайтовое чтение из файла
    #38533639
Фотография surbanec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сам сфорганил код.
ну уже разобрался с установкой положения чтения. просто иногда необходимо считать данные из большого файла от 10мб и выше. для этого я и хочу сделать побайтовую загрузку, либо загрузку блоками по несколько кб.

Dim RetStr As String = System.IO.File.ReadAllText("C:\f.txt")
этот код будет актуален с маленькими файлами или если его пустить во 2ой поток чтобы основной поток в котором форма не зависал.

всеравно в некоторых случаях не нужно считывать файл целиком. например считать определенный кусок из файла... ну в общем решил реализовать через FileStream.
там можно установить позицию чтения и считать как 1 байт так и блоками по несколько байт

ну всеже спасибо за то что ответили)
...
Рейтинг: 0 / 0
VB.NET побайтовое чтение из файла
    #38534819
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
surbanec, для обработки больших файлов совсем не обязательно читать их побайтово. Во-первых, можно прочитать его построчно:
Код: vbnet
1.
2.
3.
4.
5.
Using reader As New StreamReader("c:\f.txt")
	While Not reader.EndOfStream
		Dim line As String = reader.ReadLine()
	End While
End Using


Во-вторых, построчное чтение можно объединить с буферизованным чтением:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Using fileStream As FileStream = File.OpenRead("c:\f.txt")
	Using bufStream As New BufferedStream(fileStream, 10*1024)
		Using reader As New StreamReader(bufStream)
			While Not reader.EndOfStream
				Dim line As String = reader.ReadLine()
			End While
		End Using
	End Using
End Using


В-третьих, ты делаешь ошибочное предположение что один байт, соответствует одному символу. Это не так т.к. существуют многобайтовые кодировки (например, семейство Unicode). Более того в рамках Unicode могут встречаться байты которым не соответствует никакой символ - так называемый Byte Order Mark (BOM). Чтобы не было проблем надо читать текстовые файлы с помощью предназаченых для этого классов. Например, StreamReader. При это следует явно указать кодировку или полагаться на кодировку по умолчанию - utf-8.

P.S. Твой первоначальный код не работал из-за лишнего аргумента в функции FileGet т.к. третий параметр указывает позицию с которой нужно начать чтение.

P.P.S. Первоначальный код также крайне неэффективно использует память. Ты объявил массив строк, затем создаешь отдельные элементы этого массива и, в конце, получаешь итоговую строку. Это неэффективно т.к. заставляет тратить место на массив и на отдельные строки (которые состоят всего из одного символа). У сборщик мусора будет очень много работы в таком случае. И кол-во этой работы прямо пропорционально длине файла. Ты пылался съэкономить память, а на деле ты её зря тратил. Вот такая ирония :)

Для эффективного конструирования строк лучше использовать класс System.Text.StringBuilder. Сначала мы бы создали его - New StringBuilder(allFile) - сразу с нужной длиной. Затем с помощью метода Append() добавляли символы. И в конце вызвали бы метод ToString(). Затраты памяти были бы ниже.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / VB.NET побайтовое чтение из файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]