0 / 0 / 0
Регистрация: 09.02.2023
Сообщений: 3

При чтении vb6 стандартными способами из файла, читается не весь файл, а его часть

09.02.2023, 20:30. Показов 2210. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
При чтении vb6 стандартными способами из файла, читается не весь файл, а его часть.
Блокнотом файл открывается полностью. Может в файле какие-то есть символы, почему он останавливает чтение?
Помогите пожалуйста с кодом
Файл прикрепил
Вложения
Тип файла: zip 2106202203.zip (3.0 Кб, 46 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2023, 20:30
Ответы с готовыми решениями:

Какими способами в ассамблере,c++ читать не весь файл а только его часть?
Насколько я понимаю Mysql как раз на этом и основан,что знает позиции на жестком диске,и кое-что загружает в оперативную память.А вот...

При чтении файл пропускает часть вступления
Обращаюсь к вам за совет. У меня есть текст, это книга на английском языке. Но почему-то когда я его пытаются читать. Python...

Можно ли из интернета скачать часть файла, а не весь файл целиком?
Ребята, помогите! Нужно реализовать закачку части файла с нета (несколько байт), а не весь файл.

28
sleep
 Аватар для I can
4934 / 4598 / 841
Регистрация: 13.04.2015
Сообщений: 9,768
09.02.2023, 21:19
sid120, это из-за кодировки UTF-16LE. Да и спецсимволы там есть. Если сохранить с кодировкой ansi(ascii), то читает.
0
sleep
 Аватар для I can
4934 / 4598 / 841
Регистрация: 13.04.2015
Сообщений: 9,768
09.02.2023, 21:20
Файл
Вложения
Тип файла: rar 2106202203(2).rar (2.2 Кб, 26 просмотров)
0
0 / 0 / 0
Регистрация: 09.02.2023
Сообщений: 3
09.02.2023, 21:28  [ТС]
Спасибо за помощь! задача заключается в том, что мне нужно изменить кое какие данные и сохранить файл.
1. получается мне нужно прочитать файл в кодировке ascii
2. изменить данные
3. сохранить в кодировке UTF-16LE
0
sleep
 Аватар для I can
4934 / 4598 / 841
Регистрация: 13.04.2015
Сообщений: 9,768
09.02.2023, 22:08
Цитата Сообщение от sid120 Посмотреть сообщение
1. получается мне нужно прочитать файл в кодировке ascii
2. изменить данные
3. сохранить в кодировке UTF-16LE
Ну если использование vb6 принципиально, то придётся повозиться.
Если нет, то можно использовать другой инструмент, чтобы избежать лишних танцев с бубном.

Добавлено через 1 минуту
Цитата Сообщение от sid120 Посмотреть сообщение
UTF-16LE
А какая программа требует такую кодировку, если не секрет?

Добавлено через 21 минуту
Попробовал через fso, хорошо читает исходный файл
Код примерно такой

Visual Basic
1
2
3
4
    Set fso = CreateObject("Scripting.FileSystemObject")
    sPath = App.Path & "\2106202203.txt"
    Set ts = fso.OpenTextFile(sPath, 1, , -1)
    Text1.Text = ts.ReadAll
1
0 / 0 / 0
Регистрация: 09.02.2023
Сообщений: 3
09.02.2023, 22:31  [ТС]
Заработало!!!
Спасибо большое!!
Пробовал через fso брал примеры с интернета, также читало не весь файл.
Наверное параметры не те были указаны.
Программа CoLOS Designer
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,710
Записей в блоге: 14
10.02.2023, 09:43
Цитата Сообщение от sid120 Посмотреть сообщение
читало не весь файл
- и кто/что это "оно"? Которое читало?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.02.2023, 10:44
Можно без FSO, стандартными средствами:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Sub Form_Load()
    Dim bContent()  As Byte
    Dim sContent    As String
    
    ' // Load
    
    Open "C:\Temp\2106202203\2106202203.txt" For Binary As #1
    ReDim bContent(LOF(1) - 1)
    Get #1, , bContent
    Close 1
    
    sContent = bContent
    
    ' // Change
    
    ' // ....
    
    ' // Save
    
    Open "C:\Temp\2106202203\2106202204.txt" For Binary As #1
    bContent = sContent
    Put #1, , bContent
    Close 1
    
End Sub
3
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
25.02.2023, 16:10
Мой авторский код. Сам лично разработал функцию самого быстрого чтения файла. Быстрее не придумаешь уже.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Option Explicit
Private Declare Function IsFileAPI Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
Private Declare Function SysAllocStringByteLen Lib "oleaut32" (ByVal olestr As Long, ByVal BLen As Long) As Long
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Ptr As Long, ByVal Value As Long)
 
' Загрузка файла в переменную
Public Function LoadFileToString(FileName As String) As String
    Dim FileNo As Integer
    Dim fLen As Long
    
    If IsFileAPI(FileName) = 0 Then ' Файл не существует, с вероятностью 99%
        Exit Function
    End If
    If FileLen(FileName) = 0 Then
        Exit Function
    End If
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        fLen = LOF(FileNo)
        PutMem4 VarPtr(LoadFileToString), SysAllocStringByteLen(0&, fLen * 2) ' Мгновенно выделить память для строки
        Get #FileNo, , LoadFileToString
    Close FileNo
End Function
 
Private Sub Command1_Click()
    Dim str As String
    
    str = LoadFileToString(App.Path & "\2106202203.txt")
    Text1.Text = str
    Me.Caption = Len(Text1.Text) ' 23106 ни один символ по дороге не потерялся
End Sub
Добавлено через 1 минуту
То есть вполне можно обойтись и без байтового массива.

Добавлено через 9 минут
А так же, кому если надо, прилагаю ещё функцию подсчёта количество строк в файле. Тоже мой авторский код. Самая быстрая версия этой функции. Меньше чем за секунду обработает десятки мегабайт текстового файла. В сто раз быстрее чем стандартными средствами VB если читать файл по строкам.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Option Explicit
Private Declare Function IsFileAPI Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
Private Declare Function SysAllocStringByteLen Lib "oleaut32" (ByVal olestr As Long, ByVal BLen As Long) As Long
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Ptr As Long, ByVal Value As Long)
 
' Загрузка файла в переменную
Public Function LoadFileToString(FileName As String) As String
    Dim FileNo As Integer
    Dim fLen As Long
    
    If IsFileAPI(FileName) = 0 Then ' Файл не существует, с вероятностью 99%
        Exit Function
    End If
    If FileLen(FileName) = 0 Then
        Exit Function
    End If
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        fLen = LOF(FileNo)
        PutMem4 VarPtr(LoadFileToString), SysAllocStringByteLen(0&, fLen * 2) ' Мгновенно выделить память для строки
        Get #FileNo, , LoadFileToString
    Close FileNo
End Function
 
Private Sub Command1_Click()
    Dim str As String
    
    str = LoadFileToString(App.Path & "\2106202203.txt")
    Text1.Text = str
    Me.Caption = Len(Text1.Text) ' 23106 ни один символ по дороге не потерялся
    Print CountStrsFile(App.Path & "\2106202203.txt")
End Sub
 
' Количество строк в файле
Public Function CountStrsFile(FileName As String) As Long
    Dim FileNo As Integer
    Dim str() As Byte
    Dim strs As String
    Dim fLen As Long
    Dim FirstSearch As Long
    Dim SearchFromTheSymbol As Long
    Dim NewLine As String
    Dim cnt As Long
    
    If IsFileAPI(FileName) = 0 Then ' Файл не существует, с вероятностью 99%
        Exit Function
    End If
    If FileLen(FileName) = 0 Then
        Exit Function
    End If
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        fLen = LOF(FileNo)
        ReDim str(fLen - 1)
        Get #FileNo, , str
    Close FileNo
    
    strs = str
    
    ' Основной код
    NewLine = StrConv(vbCrLf, vbFromUnicode)
    SearchFromTheSymbol = 1
    cnt = 1
    
    ' Очень быстрый поиск новых строк
    Do
        FirstSearch = InStrB(SearchFromTheSymbol, strs, NewLine) ' Искать нужную нам строку
        If FirstSearch > 0 Then
            cnt = cnt + 1
            SearchFromTheSymbol = FirstSearch + 2 ' + vbCrLf
        End If
    Loop While FirstSearch > 0 ' Выполнять цикл до тех пор, пока будет найдена искомая подстрока
    
    CountStrsFile = cnt
End Function
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.02.2023, 19:29
Цитата Сообщение от HackerVlad Посмотреть сообщение
Мой авторский код. Сам лично разработал функцию самого быстрого чтения файла. Быстрее не придумаешь уже.
С UTF16 не работает [icode]Get #FileNo, , LoadFileToString[/icode] делает конверсию из ANSI в UNICODE, и получается текст в кодировке UTF16 еще раз конвертируется в UTF16 - получается мусор. Если уж использовать API тогда банальная связка CreateFile/ReadFile/CloseHandle дадут максимальную скорость.

Добавлено через 35 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
А так же, кому если надо, прилагаю ещё функцию подсчёта количество строк в файле. Тоже мой авторский код. Самая быстрая версия этой функции. Меньше чем за секунду обработает десятки мегабайт текстового файла. В сто раз быстрее чем стандартными средствами VB если читать файл по строкам.
Тут тоже ошибка.
Visual Basic
1
FirstSearch = InStrB(SearchFromTheSymbol, strs, NewLine) ' Искать нужную нам строку
InStrB - ищет байтовую последовательность, а ты передаешь в качестве strs - юникодную строку. + этот момент можно ускорить просто используя байтовые массивы.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
25.02.2023, 20:13
Цитата Сообщение от The trick Посмотреть сообщение
InStrB - ищет байтовую последовательность, а ты передаешь в качестве strs - юникодную строку
Насколько я помню, строка всё равно получается не в уникоде, а в ANSI, я специально так делал чтобы быстрее было. Если бы строка была, действительно, в уникоде то я использовал бы InStr, а не InStrB. Я же помню как я писал такую же функцию только в уникоде она работает медленнее. Здесь именно в ANSI получается в два раза меньше байт.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.02.2023, 20:17
Цитата Сообщение от HackerVlad Посмотреть сообщение
Насколько я помню, строка всё равно получается не в уникоде, а в ANSI, я специально так делал чтобы быстрее было. Если бы строка была, действительно, в уникоде то я использовал бы InStr, а не InStrB. Я же помню как я писал такую же функцию только в уникоде она работает медленнее. Здесь именно в ANSI получается в два раза меньше байт.
Вот тут:
Visual Basic
1
Get #FileNo, , str
происходит чтение юникодной строки в байтовый массив, затем тут:
Visual Basic
1
strs = str
происходит копирование юникодной строки из байтового массива в юникодную строку String. Далее эта юникодная строка передается в InStrB. Мало того что это неверно алгоритмически, это иногда может выдавать неверный результат.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
25.02.2023, 23:38
Цитата Сообщение от The trick Посмотреть сообщение
Вот тут:
Visual BasicВыделить код
1
Get #FileNo, , str
происходит чтение юникодной строки в байтовый массив
Что такое байтовый массив? При чтении файла в байтовый массив происходит чтение файла в строку не уникода в ANSI если сам файл находится в неуникоде. Правда я не думал что будет если сам файл будет в уникоде. Так как у меня все мои файлы в ANSI. Поэтому тут мне следовало бы подумать конечно.

Добавлено через 6 минут
Цитата Сообщение от The trick Посмотреть сообщение
происходит копирование юникодной строки из байтового массива в юникодную строку String. Далее эта юникодная строка передается в InStrB. Мало того что это неверно алгоритмически, это иногда может выдавать неверный результат.
Нет, ты не прав.

Строка НИКОГДА в этом примере не становится уникодной. Она всегда ANSIшная. Так как я загружаю не уникодные файлы.

strs = str

И даже тут строка всё равно не станет уникодной. Строка всегда будет ансишная. Я же всё проверял. Ты сам можешь проверить.

Единственный момент который я не учёл что будет если загружать файл уникодный. Об этом я только не подумал.

Добавлено через 31 минуту
Я не думал про эти кодировки файлов раньше вообще. Сейчас проверил, да, получается, что если файл в кодировке UTF-16 то не будут тогда работать мои функции LoadFileToString и CountStrsFile

Добавлено через 1 час 11 минут
Надо значит усовершенствовать функцию для уникодных файлов в том числе. Помоги мне сделать функцию правильно тогда.
Простым перебором всех символов медленно получается.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
' Количество строк в файле
Public Function CountStrsFile(FileName As String) As Long
    Dim FileNo As Integer
    Dim str() As Byte
    Dim strs As String
    Dim fLen As Long
    Dim FirstSearch As Long
    Dim SearchFromTheSymbol As Long
    Dim NewLine As String
    Dim cnt As Long
    Dim i As Long
    
    If IsFileAPI(FileName) = 0 Then ' Файл не существует, с вероятностью 99%
        Exit Function
    End If
    If FileLen(FileName) = 0 Then
        Exit Function
    End If
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        fLen = LOF(FileNo)
        ReDim str(fLen - 1)
        Get #FileNo, , str
    Close FileNo
    
    If str(2) <> 0 Then ' Файл не в уникоде
        strs = str
        
        ' Основной код
        NewLine = StrConv(vbCrLf, vbFromUnicode)
        SearchFromTheSymbol = 1
        cnt = 1
        
        ' Очень быстрый поиск новых строк
        Do
            FirstSearch = InStrB(SearchFromTheSymbol, strs, NewLine) ' Искать нужную нам строку
            If FirstSearch > 0 Then
                cnt = cnt + 1
                SearchFromTheSymbol = FirstSearch + 2 ' + vbCrLf
            End If
        Loop While FirstSearch > 0 ' Выполнять цикл до тех пор, пока будет найдена искомая подстрока
        
        CountStrsFile = cnt
    Else ' Файл вдруг оказался в уникоде
        ' Основной код
        cnt = 1
        
        ' Но цикл перебора конечно же работает медленно... В 5 раза медленнее чем InStr
        For i = 1 To UBound(str)
            If str(i) = 13 Then cnt = cnt + 1
        Next
        
        CountStrsFile = cnt
    End If
End Function
Добавлено через 6 минут
Хотя! Откомпилировав EXE со всеми галочками оптимизации стало даже быстрее через цикл перебора простой ахаххахаха я в шоке

Добавлено через 30 минут
А есть ли в Windows API функция которая подсчитывает количество определённых знаков в строке? Типа как count_chars в PHP.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.02.2023, 23:49
Цитата Сообщение от HackerVlad Посмотреть сообщение
Что такое байтовый массив? При чтении файла в байтовый массив происходит чтение файла в строку не уникода в ANSI если сам файл находится в неуникоде. Правда я не думал что будет если сам файл будет в уникоде. Так как у меня все мои файлы в ANSI. Поэтому тут мне следовало бы подумать конечно.
У тебя в коде ты используешь файл ТСа, который как раз UTF16.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Нет, ты не прав.
Строка НИКОГДА в этом примере не становится уникодной. Она всегда ANSIшная. Так как я загружаю не уникодные файлы.
strs = str
И даже тут строка всё равно не станет уникодной. Строка всегда будет ансишная. Я же всё проверял. Ты сам можешь проверить.
Единственный момент который я не учёл что будет если загружать файл уникодный. Об этом я только не подумал.
Читай выше.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Хотя! Откомпилировав EXE со всеми галочками оптимизации стало даже быстрее через цикл перебора простой ахаххахаха я в шоке
Вот я о том тебе и говорил. Самый быстрый будет на вб.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
26.02.2023, 00:20
Цитата Сообщение от The trick Посмотреть сообщение
У тебя в коде ты используешь файл ТСа, который как раз UTF16.
Если ты имеешь ввиду файл 2106202203.txt то я его скачал и он у меня в Windows1251 обычной ANSI кодировке.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
26.02.2023, 00:25
Цитата Сообщение от HackerVlad Посмотреть сообщение
Если ты имеешь ввиду файл 2106202203.txt то я его скачал и он у меня в Windows1251 обычной ANSI кодировке.
Первый файл в теме - UTF16, из-за этого у ТС и возникали проблемы.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
26.02.2023, 03:45
Цитата Сообщение от The trick Посмотреть сообщение
Первый файл в теме - UTF16, из-за этого у ТС и возникали проблемы.
Да, я не обратил внимание на первый файл на зипку

Добавлено через 36 минут
Я ошибался, извиняюсь, вот правильный код для UTF16LE. Но так и не придумал кода для UTF16BE.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
' Загрузка файла в переменную
Public Function LoadFileToStringUTF16LE(FileName As String) As String
    Dim FileNo As Integer
    Dim str() As Byte
    Dim fLen As Long
    
    If IsFileAPI(FileName) = 0 Then Exit Function ' Файл не существует, с вероятностью 99%
    If FileLen(FileName) = 0 Then Exit Function
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        fLen = LOF(FileNo)
        ReDim str(fLen - 1)
        Get #FileNo, , str
    Close FileNo
    
    LoadFileToStringUTF16LE = str
End Function
Добавлено через 1 час 7 минут
Для UTF16BE на ум, к сожалению, пришёл только говно-код с CopyMemory
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
' Загрузка файла в переменную
Public Function LoadFileToStringUTF16BE(FileName As String) As String
    Dim FileNo As Integer
    Dim fLen As Long
    Dim str() As Byte
    Dim strs As String
    Dim strs2 As String
    
    If IsFileAPI(FileName) = 0 Then Exit Function ' Файл не существует, с вероятностью 99%
    If FileLen(FileName) = 0 Then Exit Function
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        fLen = LOF(FileNo)
        ReDim str(fLen - 1)
        Get #FileNo, , str
    Close FileNo
    
    strs = str
    strs2 = Space$(fLen)
    
    CopyMemory StrPtr(strs2), StrPtr(strs) + 3, fLen
    
    LoadFileToStringUTF16BE = strs2
End Function
Но этот код не очень с русским языком и с переходами на новую строку как-то... А в VB6 как хранятся строки вообще? В UTF8??? И перевод на новую строку это 0D 0A а не 0D 00 0A, кто знает?

Добавлено через 40 минут
Наконец-то придумал простой код для UTF16-BE просто байты поменял местами через обычный цикл да и всё дело, через два цикла вернее, вы наверное сможете придумать более простой код через простое деление через And через Mod ещё там как-то я так не умею короче, но всё равно нормик вышло)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
' Загрузка файла в переменную
Public Function LoadFileToStringUTF16BE(FileName As String) As String
    Dim FileNo As Integer
    Dim fLen As Long
    Dim str() As Byte
    Dim strLE() As Byte
    Dim i As Long
    
    If IsFileAPI(FileName) = 0 Then Exit Function ' Файл не существует, с вероятностью 99%
    If FileLen(FileName) = 0 Then Exit Function
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        fLen = LOF(FileNo)
        ReDim str(fLen - 1)
        Get #FileNo, , str
    Close FileNo
    
    ReDim strLE(fLen - 1)
    
    For i = 0 To UBound(str) Step 2
        If i <> UBound(str) Then strLE(i + 1) = str(i)
    Next
    For i = 1 To UBound(str) Step 2
        strLE(i - 1) = str(i)
    Next
    
    LoadFileToStringUTF16BE = strLE
End Function
Добавлено через 52 минуты
Наконец-таки сделал правильную функцию универсальную для загрузки файла в переменную в не зависимости от кодировки текста:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
' Универсальная функция загрузки файла в переменную, в не зависимости от кодировки
Public Function LoadFileToStringUniversal(FileName As String) As String
    Dim FileNo As Integer
    Dim fLen As Long
    Dim str() As Byte
    Dim strLE() As Byte
    Dim TheFirstTwoBytes(1) As Byte
    Dim i As Long
    
    If IsFileAPI(FileName) = 0 Then Exit Function ' Файл не существует, с вероятностью 99%
    If FileLen(FileName) = 0 Then Exit Function
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        Get #FileNo, 1, TheFirstTwoBytes
    Close FileNo
    
    If TheFirstTwoBytes(0) <> 254 And TheFirstTwoBytes(0) <> 255 And TheFirstTwoBytes(1) <> 254 And TheFirstTwoBytes(1) <> 255 Then ' Кодировка не UTF16-LE и не UTF16-BE, значит скорее всего, простая кодировка ANSI
        ' Инициализировать счётчик
        FileNo = FreeFile
        
        ' Открыть файл
        Open FileName For Binary As FileNo
            fLen = LOF(FileNo)
            PutMem4 VarPtr(LoadFileToStringUniversal), SysAllocStringByteLen(0&, fLen * 2) ' Мгновенно выделить память для строки
            Get #FileNo, , LoadFileToStringUniversal
        Close FileNo
        
        Exit Function
    End If
    
    If TheFirstTwoBytes(0) = 255 And TheFirstTwoBytes(1) = 254 Then ' Кодировка UTF16-LE
        ' Инициализировать счётчик
        FileNo = FreeFile
        
        ' Открыть файл
        Open FileName For Binary As FileNo
            ReDim str(LOF(FileNo) - 1)
            Get #FileNo, , str
        Close FileNo
        
        LoadFileToStringUniversal = Mid(str, 2) ' Исключить служебные первые два байта
        Exit Function
    End If
    
    If TheFirstTwoBytes(0) = 254 And TheFirstTwoBytes(1) = 255 Then ' Кодировка UTF16-BE
        ' Инициализировать счётчик
        FileNo = FreeFile
        
        ' Открыть файл
        Open FileName For Binary As FileNo
            fLen = LOF(FileNo)
            ReDim str(fLen - 1)
            Get #FileNo, , str
        Close FileNo
        
        ReDim strLE(fLen - 1)
        
        For i = 0 To UBound(str) Step 2
            If i <> UBound(str) Then strLE(i + 1) = str(i)
        Next
        For i = 1 To UBound(str) Step 2
            strLE(i - 1) = str(i)
        Next
        
        LoadFileToStringUniversal = Mid(strLE, 2) ' Исключить служебные первые два байта
    End If
End Function
Добавлено через 2 минуты
Наконец-таки сделал правильную функцию универсальную для загрузки файла в переменную в не зависимости от кодировки текста:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
' Универсальная функция загрузки файла в переменную, в не зависимости от кодировки
Public Function LoadFileToStringUniversal(FileName As String) As String
    Dim FileNo As Integer
    Dim fLen As Long
    Dim str() As Byte
    Dim strLE() As Byte
    Dim TheFirstTwoBytes(1) As Byte
    Dim i As Long
    
    If IsFileAPI(FileName) = 0 Then Exit Function ' Файл не существует, с вероятностью 99%
    If FileLen(FileName) = 0 Then Exit Function
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        Get #FileNo, 1, TheFirstTwoBytes
    Close FileNo
    
    If TheFirstTwoBytes(0) <> 254 And TheFirstTwoBytes(0) <> 255 And TheFirstTwoBytes(1) <> 254 And TheFirstTwoBytes(1) <> 255 Then ' Кодировка не UTF16-LE и не UTF16-BE, значит скорее всего, простая кодировка ANSI
        ' Инициализировать счётчик
        FileNo = FreeFile
        
        ' Открыть файл
        Open FileName For Binary As FileNo
            fLen = LOF(FileNo)
            PutMem4 VarPtr(LoadFileToStringUniversal), SysAllocStringByteLen(0&, fLen * 2) ' Мгновенно выделить память для строки
            Get #FileNo, , LoadFileToStringUniversal
        Close FileNo
        
        Exit Function
    End If
    
    If TheFirstTwoBytes(0) = 255 And TheFirstTwoBytes(1) = 254 Then ' Кодировка UTF16-LE
        ' Инициализировать счётчик
        FileNo = FreeFile
        
        ' Открыть файл
        Open FileName For Binary As FileNo
            ReDim str(LOF(FileNo) - 1)
            Get #FileNo, , str
        Close FileNo
        
        LoadFileToStringUniversal = Mid(str, 2) ' Исключить служебные первые два байта
        Exit Function
    End If
    
    If TheFirstTwoBytes(0) = 254 And TheFirstTwoBytes(1) = 255 Then ' Кодировка UTF16-BE
        ' Инициализировать счётчик
        FileNo = FreeFile
        
        ' Открыть файл
        Open FileName For Binary As FileNo
            fLen = LOF(FileNo)
            ReDim str(fLen - 1)
            Get #FileNo, , str
        Close FileNo
        
        ReDim strLE(fLen - 1)
        
        For i = 0 To UBound(str) Step 2
            If i <> UBound(str) Then strLE(i + 1) = str(i)
        Next
        For i = 1 To UBound(str) Step 2
            strLE(i - 1) = str(i)
        Next
        
        LoadFileToStringUniversal = Mid(strLE, 2) ' Исключить служебные первые два байта
    End If
End Function
0
sleep
 Аватар для I can
4934 / 4598 / 841
Регистрация: 13.04.2015
Сообщений: 9,768
26.02.2023, 08:56
Цитата Сообщение от HackerVlad Посмотреть сообщение
Наконец-таки сделал правильную функцию универсальную для загрузки файла в переменную в не зависимости от кодировки текста:
Правда что ли? А проверял?
Миниатюры
При чтении vb6 стандартными способами из файла, читается не весь файл, а его часть  
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
26.02.2023, 10:07
Цитата Сообщение от HackerVlad Посмотреть сообщение
Наконец-таки сделал правильную функцию универсальную для загрузки файла в переменную в не зависимости от кодировки текста:
Я делал подобное уже, там и UTF8 чекается https://www.cyberforum.ru/post14822658.html
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
26.02.2023, 12:53
Цитата Сообщение от I can Посмотреть сообщение
Правда что ли? А проверял?
Да, я только для двух версий UTF16 написал, UTF8 думал оставить на сегодня уже, итак вчера до 3 ночи провозился...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2023, 12:53
Помогаю со студенческими работами здесь

Можно ли стандартными средствами VBA получить из объекта range его часть
Коллеги, Можно ли стандартными средствами VBA получить из объекта range его часть? Например объект range - это матрица размером 10x10,...

Как сделать чтобы окно не открывалось на весь экран при его премещении в верхнюю крайнюю часть монитора?
При работе с окнами бывает необходимость их сдвигать вверх или вбок и в Windows 10 окно открывается на весь экран когда оно выходит за...

Delphi 7,ini файлы,при чтении с ini файлов весь файл загружается в оп или каким образом это происходит?
причина вопроса заключается в том, есть ли смысл разбивать один ini файл на несколько

Где находится файл при записи/чтении объекта и как его прочитать?
Доброго всем времени суток! Есть код записи объекта на диск (ниже). Насколько я понимаю, объект записывается в файл file.dat. Как можно...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru