С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

Функция подсчёта количества строк в файле на VB6 (для всех кодировок файлов)

03.03.2023, 18:02. Показов 1651. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! В моих проектах, мне иногда надо подсчитывать количество строк в файле. Я очень долго искал самый быстрый способ это сделать. Особенно когда файлы по 50-100 МБ и количество строк в этих файлах доходит до миллиона или даже больше... Усложняется ситуация тогда, когда файлы имеют разные кодировки. Сейчас я написал две функции для ANSI и UTF8 кодировки и для UTF16.

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Option Explicit
Private Declare Function IsFileAPI Lib "shlwapi" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
Private Declare Function StrStrA Lib "shlwapi" (ByVal pszFirst As Long, ByVal pszSrch As Long) As Long
Private Declare Function StrStrW Lib "shlwapi" (ByVal pszFirst As Long, ByVal pszSrch As Long) As Long
 
' Подсчитать количество строк в файле, в кодировке ANSI или UTF8
Public Function CountStrsFromFileA(FileName As String) As Long
    Dim FileNo As Integer
    Dim str() As Byte
    Dim fLen As Long
    Dim NewLine As Long
    Dim FirstSearch As Long
    Dim SearchFromTheSymbol As Long
    Dim cnt As Long
    
    If IsFileAPI(FileName) = 0 Then Exit Function ' Файл не существует, с вероятностью 99%
    fLen = FileLen(FileName)
    If fLen = 0 Then Exit Function
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        ReDim str(fLen - 1)
        Get #FileNo, , str
    Close FileNo
    
    cnt = 1
    SearchFromTheSymbol = VarPtr(str(0))
    NewLine = StrPtr(vbNewLine)
    
    Do
        FirstSearch = StrStrA(SearchFromTheSymbol, NewLine) ' Искать нужную нам строку
        If FirstSearch > 0 Then
            cnt = cnt + 1
            SearchFromTheSymbol = FirstSearch + 2 ' + vbcrlf
        End If
    Loop While FirstSearch > 0 ' Выполнять цикл до тех пор, пока будет найдена искомая подстрока
    
    CountStrsFromFileA = cnt
End Function
 
' Подсчитать количество строк в файле, в кодировке UTF16LE или UTF16BE (работает даже без BOM)
Public Function CountStrsFromFileW(FileName As String) As Long
    Dim FileNo As Integer
    Dim str() As Byte
    Dim fLen As Long
    Dim NewLine As Long
    Dim FirstSearch As Long
    Dim SearchFromTheSymbol As Long
    Dim cnt As Long
    Dim i As Long
    
    If IsFileAPI(FileName) = 0 Then Exit Function ' Файл не существует, с вероятностью 99%
    fLen = FileLen(FileName)
    If fLen = 0 Then Exit Function ' Если в файле 0 байт значит в файле 0 строк
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open FileName For Binary As FileNo
        ReDim str(fLen - 1)
        Get #FileNo, , str
    Close FileNo
    
    ' Если файл это файл размером один байт
    If UBound(str) < 1 Then
        If str(0) = 13 Then cnt = 2
        
        CountStrsFromFileW = cnt
        Exit Function
    End If
    
    If str(0) = 254 And str(1) = 255 Then ' UTF16BE
        SearchFromTheSymbol = VarPtr(str(1)) ' Изменим адресацию поиска +1 байт
        NewLine = StrPtr(Chr(13) & Chr(0) & Chr(10))
    Else ' UTF16LE обычное
        SearchFromTheSymbol = VarPtr(str(0))
        NewLine = StrPtr(vbNewLine)
    End If
    
    cnt = 1 ' Будем предполагать, что в файле всегда есть хотя бы одна строка, если в файле не 0 байт конечно...
    
    Do
        FirstSearch = StrStrW(SearchFromTheSymbol, NewLine) ' Искать нужную нам строку
        If FirstSearch > 0 Then
            cnt = cnt + 1
            SearchFromTheSymbol = FirstSearch + 4 ' + vbcrlf
        End If
    Loop While FirstSearch > 0 ' Выполнять цикл до тех пор, пока будет найдена искомая подстрока
    
    If cnt = 1 Then ' Если ничего не найдено, попытаться поискать снова (на случай если в файле UTF16BE была утрачена запись BOM)
        SearchFromTheSymbol = VarPtr(str(1)) ' Изменим адресацию поиска +1 байт
        NewLine = StrPtr(Chr(13) & Chr(0) & Chr(10))
    
        Do
            FirstSearch = StrStrW(SearchFromTheSymbol, NewLine) ' Искать нужную нам строку
            If FirstSearch > 0 Then
                cnt = cnt + 1
                SearchFromTheSymbol = FirstSearch + 4 ' + vbcrlf
            End If
        Loop While FirstSearch > 0 ' Выполнять цикл до тех пор, пока будет найдена искомая подстрока
    End If
    
    CountStrsFromFileW = cnt
End Function
Это самый быстрый способ подсчитать количество строк в файле, но самый быстрый лишь в среде выполнения IDE VB6 или в откомпилированном P-коде. В откомпилированном Native-коде со всеми галочками оптимизации конечно же будет работать быстрее (но только чуть-чуть быстрее) простой цикл перебора, но не в самом VB6!!!

В этой функции я сразу здесь ищу, символы перехода на новую строку, сразу в байтовом массиве. Без лишних присвоений и копирований в строку (так экономится и память и скорость). Думал также сделать, искать в байтовом массиве через встроенную функцию InStr но не получилось! Функция InStr не ищет в байтовом массиве, а ищет только в строке! Поэтому я хотел бы узнать, почему функция InStr не ищет в байтовом массиве? Если байтовый массив это массив содержимого файла.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2023, 18:02
Ответы с готовыми решениями:

Написать программу подсчета количества строк в тексте в бинарном файле
Хочу чтобы считало мои текстовый документ, не могу, что не так? #include &lt;iostream&gt; #include &lt;ios&gt; #include &lt;fstream&gt; ...

Написать программу подсчета количества строк в файле (желательно, не используя буферы)
Добрый день. У меня такая проблема, нужно посчитать количество строк в файле, но без буферизации, так как файл может быть очень большим....

Функция замены всех отрицательных элементов массива нулями и подсчета количества замен
Объявить делегат. Реализовать функции ввода и вывода элементов одномерного массива. Создать экземпляры делегата, вызвать реализованные...

25
sleep
 Аватар для I can
4916 / 4567 / 838
Регистрация: 13.04.2015
Сообщений: 9,698
03.03.2023, 18:08
Ну вот, пример на overflow

Given a 7,000,000 line file of 293MB it only takes 0.7 seconds here.

Куда быстрее? Куда спешишь-то?
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.03.2023, 18:12  [ТС]
Посмотрел ихний пример, я думаю ихняя функция будет медленнее чем моя
0
sleep
 Аватар для I can
4916 / 4567 / 838
Регистрация: 13.04.2015
Сообщений: 9,698
03.03.2023, 18:18
Цитата Сообщение от HackerVlad Посмотреть сообщение
ихняя функция будет медленнее чем моя
Ну а зачем быстрее-то? Какая в этом практическая польза? Лучше бы потратил время на что-то нужное
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.03.2023, 18:25  [ТС]
У них чуть быстрее всё таки, чем у меня, спасибо за пример, но у них возвращает на одну строчку меньше чем реально существует почему-то

Добавлено через 5 минут
Работает даже в два раза быстрее, чем у меня, я в шоке... но с количеством строк немного неправильно определяет, доводить до ума ещё нужно будет ихнею функцию
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
03.03.2023, 21:58
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
Option Explicit
Option Base 0
 
Private Const INVALID_HANDLE_VALUE    As Long = -1
Private Const FILE_MAP_READ           As Long = &H4
Private Const PAGE_READONLY           As Long = 2&
Private Const GENERIC_READ            As Long = &H80000000
Private Const OPEN_EXISTING           As Long = 3
Private Const FILE_ATTRIBUTE_NORMAL   As Long = &H80
 
Private Type SAFEARRAYBOUND
    cElements   As Long
    lLBound     As Long
End Type
 
Private Type SAFEARRAY1D
    cDims       As Integer
    fFeatures   As Integer
    cbElements  As Long
    cLocks      As Long
    pvData      As Long
    tBounds     As SAFEARRAYBOUND
End Type
 
Private Type LARGE_INTEGER
    lowpart     As Long
    highpart    As Long
End Type
 
Private Declare Function CreateFile Lib "kernel32" _
                         Alias "CreateFileW" ( _
                         ByVal lpFileName As Long, _
                         ByVal dwDesiredAccess As Long, _
                         ByVal dwShareMode As Long, _
                         ByRef lpSecurityAttributes As Any, _
                         ByVal dwCreationDisposition As Long, _
                         ByVal dwFlagsAndAttributes As Long, _
                         ByVal hTemplateFile As Long) As Long
Private Declare Function MapViewOfFile Lib "kernel32" ( _
                         ByVal hFileMappingObject As OLE_HANDLE, _
                         ByVal dwDesiredAccess As Long, _
                         ByVal dwFileOffsetHigh As Long, _
                         ByVal dwFileOffsetLow As Long, _
                         ByVal dwNumberOfBytesToMap As Long) As Long
Private Declare Function UnmapViewOfFile Lib "kernel32" ( _
                         ByVal lpBaseAddress As Long) As Long
Private Declare Function OpenFileMapping Lib "kernel32" _
                         Alias "OpenFileMappingW" ( _
                         ByVal dwDesiredAccess As Long, _
                         ByVal bInheritHandle As Long, _
                         ByVal lpName As Long) As Long
Private Declare Function CreateFileMapping Lib "kernel32" _
                         Alias "CreateFileMappingW" ( _
                         ByVal hFile As OLE_HANDLE, _
                         ByRef lpFileMappingAttributes As Any, _
                         ByVal flProtect As Long, _
                         ByVal dwMaximumSizeHigh As Long, _
                         ByVal dwMaximumSizeLow As Long, _
                         ByVal lpName As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
                         ByVal hObject As OLE_HANDLE) As Long
Private Declare Function GetFileSizeEx Lib "kernel32" ( _
                         ByVal hFile As Long, _
                         ByRef lpFileSize As LARGE_INTEGER) As Long
Private Declare Function ArrPtr Lib "msvbvm60" _
                         Alias "VarPtr" ( _
                         ByRef pArr() As Any) As Long
Private Declare Function PutMem4 Lib "msvbvm60" ( _
                         ByRef pDst As Any, _
                         ByVal lValue As Any) As Long
Private Declare Function memchr CDecl Lib "ntdll" ( _
                         ByRef pDst As Any, _
                         ByVal c As Long, _
                         ByVal lCount As Long) As Long
                         
Sub Main()
    Dim lCount  As Long
    Dim f As Single
    
    f = Timer
    
    CountLinesAnsi "C:\temp\test_big.txt", lCount
    
    MsgBox Format$(Timer - f, "0.000") & "sec" & vbNewLine & "Lines: " & lCount
    
End Sub
 
Public Function CountLinesAnsi( _
                ByRef sFileName As String, _
                ByRef lRet As Long) As Long
    Dim hFile       As OLE_HANDLE
    Dim hMap        As OLE_HANDLE
    Dim tSize       As LARGE_INTEGER
    Dim tArrDesc    As SAFEARRAY1D
    Dim lText()     As Long
    Dim hr          As Long
    Dim lIndex      As Long
    Dim lCount      As Long
    Dim lBits       As Long
    Dim lTest       As Long
    Dim pData       As Long
    Dim pData2      As Long
    Dim bIsInIDE    As Boolean
    
    hFile = CreateFile(StrPtr(sFileName), GENERIC_READ, 0, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    If hFile = INVALID_HANDLE_VALUE Then
        hr = &H80070000 Or (Err.LastDllError And &HFFFF&)
        GoTo CleanUp
    End If
    
    If GetFileSizeEx(hFile, tSize) = 0 Then
        hr = &H80070000 Or (Err.LastDllError And &HFFFF&)
        GoTo CleanUp
    End If
    
    If tSize.highpart <> 0 Or tSize.lowpart < 0 Or tSize.lowpart > &H40000000 Then
        hr = &H8000FFFF
        GoTo CleanUp
    ElseIf tSize.lowpart = 0 Then
        lRet = 0
        GoTo CleanUp
    End If
        
    hMap = CreateFileMapping(hFile, ByVal 0&, PAGE_READONLY, 0, 0, 0)
    If hMap = 0 Then
        hr = &H80070000 Or (Err.LastDllError And &HFFFF&)
        GoTo CleanUp
    End If
    
    With tArrDesc
        
        .pvData = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)
        
        If .pvData = 0 Then
            hr = &H80070000 Or (Err.LastDllError And &HFFFF&)
            GoTo CleanUp
        End If
        
        .cDims = 1
        .cbElements = 4
        .tBounds.cElements = (tSize.lowpart + 3) \ 4
        
    End With
    
    PutMem4 ByVal ArrPtr(lText), VarPtr(tArrDesc)
    
    Debug.Assert MakeTrue(bIsInIDE)
    
    If bIsInIDE Then
    
        pData = VarPtr(lText(0)) - 1
        
        Do
        
            pData2 = memchr(ByVal pData + 1, &HA, tSize.lowpart)
        
            If pData2 Then
                lCount = lCount + 1
                tSize.lowpart = tSize.lowpart - (pData2 - pData)
            End If
            
            pData = pData2
            
         Loop While pData
         
    Else
    
        For lIndex = 0 To UBound(lText)
 
            lBits = lText(lIndex) Xor &HA0A0A0A
            lTest = ((lBits + &H7EFEFEFF) Xor (Not lBits)) And &H81010100
            
            If lTest Then
                
                If lTest And &H100 Then
                    lCount = lCount + 1
                End If
                If lTest And &H10000 Then
                    lCount = lCount + 1
                End If
                If lTest And &H1000000 Then
                    lCount = lCount + 1
                End If
                If (lBits And &HFF000000) = 0 Then
                    lCount = lCount + 1
                End If
                
            End If
 
        Next
    
    End If
    
    lCount = lCount + 1
 
    lRet = lCount
    
CleanUp:
    
    PutMem4 ByVal ArrPtr(lText), ByVal 0&
    
    If tArrDesc.pvData Then
        UnmapViewOfFile tArrDesc.pvData
    End If
    
    If hMap Then
        CloseHandle hMap
    End If
    
    If hFile Then
        CloseHandle hFile
    End If
    
    CountLinesAnsi = hr
    
End Function
 
Private Function MakeTrue( _
                 ByRef bValue As Boolean) As Boolean
    MakeTrue = True
    bValue = True
End Function
В скомпилированном в Native код эта реализация еще быстрее у меня. Для IDE нужно поставить этот Add-in.
2
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2023, 09:19  [ТС]
Большое спасибо, скорость просто фантастическая. Но есть одно но. В IDE выдаёт один результат (правильный) в EXE уже другое количество строк на одну строку не совпадает. Почему вообще в VB6 выдаёт один результат а в EXE совсем другой.

Кстати EXE тоже не сразу заработал. Только со всеми галочками оптимизации работает.
1
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
04.03.2023, 09:37
Цитата Сообщение от HackerVlad Посмотреть сообщение
Большое спасибо, скорость просто фантастическая. Но есть одно но. В IDE выдаёт один результат (правильный) в EXE уже другое количество строк на одну строку не совпадает. Почему вообще в VB6 выдаёт один результат а в EXE совсем другой.
На каком файле выдает разный результат, можно пример.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2023, 09:39  [ТС]
Да, это действительно самый быстрый способ, прям по скорости чтения диска, быстрее уже не придумаешь.

Пробовал на файле ANSI размером 40 Мб и количеством строк 572 593. Без пустой строки в конце файла (я не люблю пустые строки в конце файла, зачем тратить лишние 2 байта). И вот результат в VB6 правильный 572593 строки всего за 0,082 сек.
Затем откомпилировал в EXE в натив код со всеми галочками, запустил EXE а строк уже совсем другое количество 572594 уже! Уже на одну строку больше почему-то! Зато скорость сумасшедшая 0,031 сек.
Миниатюры
Функция подсчёта количества строк в файле на VB6 (для всех кодировок файлов)   Функция подсчёта количества строк в файле на VB6 (для всех кодировок файлов)   Функция подсчёта количества строк в файле на VB6 (для всех кодировок файлов)  

0
 Аватар для Mikle Quits
759 / 278 / 14
Регистрация: 21.01.2023
Сообщений: 397
04.03.2023, 09:54
Цитата Сообщение от HackerVlad Посмотреть сообщение
0,082 сек.
0,031 сек.
Такие промежутки времени лучше уже с помощью QueryPerfirmanceCounter() замерять, Timer() даст сильно неточный результат.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2023, 10:06  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Такие промежутки времени лучше уже с помощью QueryPerfirmanceCounter() замерять
Так это же твой код, я ничего не менял, я обычный GetTickCount замеряю

Добавлено через 8 минут
Цитата Сообщение от The trick Посмотреть сообщение
можно пример
Для интереса вставил пустую строку в конец файла - результат такой же: опять в EXE выдаёт на одну строку больше чем в VB6
0
 Аватар для Mikle Quits
759 / 278 / 14
Регистрация: 21.01.2023
Сообщений: 397
04.03.2023, 10:13
Цитата Сообщение от HackerVlad Посмотреть сообщение
Так это же твой код
Ты меня с The trick путаешь.
Цитата Сообщение от HackerVlad Посмотреть сообщение
я обычный GetTickCount замеряю
Точность та же, что у таймера.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2023, 10:19  [ТС]
В кодировке UTF8 в EXE вообще выдало 572601 строку (на 8 строк больше!!!), хотя в VB6 определяет по прежнему правильно 572593

Добавлено через 1 минуту
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Ты меня с The trick путаешь
И правда перепутал, извини, я просто ждал ответа The trick и не прочитал от кого сообщение...

Добавлено через 2 минуты
А в кодировке UTF16 даёт одинаковый результат что в EXE что в IDE (на 3 строки больше чем надо)

Добавлено через 1 минуту
Цитата Сообщение от Mikle Quits Посмотреть сообщение
QueryPerfirmanceCounter
У тебя есть пример кода для vb?
0
 Аватар для Mikle Quits
759 / 278 / 14
Регистрация: 21.01.2023
Сообщений: 397
04.03.2023, 10:23
Цитата Сообщение от HackerVlad Посмотреть сообщение
У тебя есть пример кода для vb?
Только что выложил в "Готовые решения".
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2023, 10:32  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Только что выложил в "Готовые решения".
Я посмотрел, но там всё равно нет примера как пользоваться.
Есть функция QTimeReset что она должна принимать? Что мне передавать в качестве параметра? Timer?

Я бы хотел такой пример хороший, чтобы всё было понятно.

Функция замера.

Код длительного выполнения Например For i = 0 To 100000000 Next

Функция которая говорит сколько времени прошло и в каких единицах времени
0
 Аватар для Mikle Quits
759 / 278 / 14
Регистрация: 21.01.2023
Сообщений: 397
04.03.2023, 10:41
Можно однократно вставить в начале кода:

PureBasic
1
QTimeReset 0
Функция QTime() возвращает время так же, как Timer(), но точнее.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2023, 10:49  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Функция QTime() возвращает время так же, как Timer(), но точнее.
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
Option Explicit
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long
 
Dim QF As Currency
Dim OldQC As Currency
Dim MinCur As Currency
Dim MaxCur As Currency
Dim QTimeVal As Double
 
Public Sub QTimeReset(ByVal Time As Double)
  MaxCur = CCur("922337203685477") + CCur(0.5807)
  MinCur = -MaxCur - CCur(0.0001)
  QueryPerformanceCounter OldQC
  QueryPerformanceFrequency QF
  QTimeVal = Time
End Sub
 
Public Function QTime() As Double
  Dim QC As Currency
 
  QueryPerformanceCounter QC
  If QC >= OldQC Then
    QTimeVal = QTimeVal + (QC - OldQC) / QF
  Else
    QTimeVal = QTimeVal + ((MaxCur - OldQC) + (QC - MinCur)) / QF
  End If
  OldQC = QC
  QTime = QTimeVal
End Function
 
Private Sub Form_Load()
    Dim lCount  As Long
    Dim f As Single
    
    f = Timer
    
    QTimeReset 0
    
    CountLinesAnsi "f:\Проекты Test\Чтение странного TXT\40 BE.txt", lCount
    
    MsgBox Format$(Timer - f, "0.000") & "sec" & vbNewLine & "Lines: " & lCount & vbNewLine & QTime
End Sub
Итак теперь я пользуюсь твоим замерением времени но оно работает только в VB6 правильно, в откомпилированном EXE со всеми галочками оптимизации даёт неправильный дебильный результат. Сам проверь, пожалуйста.

Добавлено через 3 минуты
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Функция QTime() возвращает время так же, как Timer(), но точнее.
Выдаёт цифру большую вместе с буквой E. Неправильно немного работает, проверь пожалуйста.
0
 Аватар для Mikle Quits
759 / 278 / 14
Регистрация: 21.01.2023
Сообщений: 397
04.03.2023, 10:57
Цитата Сообщение от HackerVlad Посмотреть сообщение
Выдаёт цифру большую вместе с буквой E
Это результат в экспоненциальном формате.
Вместо "& QTime" в последней строке поставь "& Format$(QTime, "0.000000")"
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2023, 11:55  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
поставь "& Format$(QTime, "0.000000")
Да, спасибо, теперь всё работает, выдаёт результат всегда отличающийся немного от обычного Timer. Но я думаю для людей это не сильно важно плюс минус эти доли секунды...

Добавлено через 38 минут
Цитата Сообщение от The trick Посмотреть сообщение
Для IDE нужно поставить этот Add-in.
Скажи, пожалуйста, а зачем использовать cdecl? Почему нельзя обычное stdcall? Вообще удивился этой надстройке, если честно)))
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
04.03.2023, 12:02
HackerVlad, ошибку нашел, исправил. Спасибо за тест!

Добавлено через 2 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
Скажи, пожалуйста, а зачем использовать cdecl? Почему нельзя обычное stdcall? Вообще удивился этой надстройке, если честно)))
Потому что это сишная функция и имеет соглашение CDECL. VB6 не позволяет вызывать CDECL функции. Надстройка снимает это ограничение.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.03.2023, 12:02
Помогаю со студенческими работами здесь

Написать программу для подсчета количества слов в файле
Помогите решить задачу на с++. Создать текстовый файл, состоящий из одной строки и содержит слова, разделенные символом пропуска, знаки...

Создать приложение для подсчета количества пробел в текстовом файле
Использовать оператор цикла while.

Программа для подсчета количества строк в тексте
Нужно написать программу, для подсчета количества строк в текстовом файле, и каждые 5 строк она должна делать абзац. Помогите пожалуйста,...

Функция для подсчета суммы и количества элементов больше K
Добрый вечер! Есть задачка одна - звучит так: С помощью генератора случайных чисел сформировать квадратную матрицу вещественных чисел...

Рекурсивная функция для подсчета количества в структуре TreeView
Здравствуйте. Прошу помочь разобраться и написать рекурсивную функцию для подсчета количества человек в отделе, описанной в структуре...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru