Страница: 1 | 2 | 3 |
Вопрос: Неясные глюки
Добавлено: 11.08.04 17:53
Автор вопроса: NovichoK
Вообщем я элементарным способом считываю построчно себе файл:
Open Path For Input As #1
Do While Not EOF(1)
Input #1, Stroka
Cnt = Cnt + 1
Loop
Close (1)
Но не известно по-каким причинам,файл не дочитывается до конца (EOF(1)=true срабатывает раньше конца файла).
Подскажите что это за бока и как их устранить?
В тексте есть каверзные символы - не может ли быть среди них символа окончания файла?
Ответы
Всего ответов: 34
Номер ответа: 1
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #1
Добавлено: 11.08.04 18:04
Кто-нибудь видел символ оканчания файла??? ))
Номер ответа: 2
Автор ответа:
Андрей Никитин
ICQ: 325172082
Вопросов: 3
Ответов: 81
Профиль | | #2
Добавлено: 11.08.04 18:38
Попробуй открыть в двоичном режиме и прочитать до конца файла, если прочитается до конца, значит возможно "каверзные символы". Посмотри также когда у тебя прерывается чтение в твоем примере. На одном и том же месте?
Номер ответа: 3
Автор ответа:
NovichoK
Вопросов: 72
Ответов: 147
Профиль | | #3
Добавлено: 11.08.04 20:45
to Андрей Никитин: да в одном и том же месте, и самое главное если эту строку удалить - читает дальше...
Номер ответа: 4
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #4
Добавлено: 11.08.04 21:15
А еще вот что можно использовать вместо Input:
Line Input #1, Stroka:
Do While Not EOF(1)
Line Input #1, Stroka
Cnt = Cnt + 1
Loop
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 12.08.04 00:31
> Кто-нибудь видел символ оканчания файла??? ))
Я видел. А если ты хочешь тоже, то напиши такую несложную программу:
Private Sub Command1_Click()
f = FreeFile
Open "txt.txt" For Output As f
Print #f, String(5, 0);
For i = 0 To 255
Print #f, Chr(i);
Next
Close
End Sub
Private Sub Command2_Click()
f = FreeFile
Open "txt.txt" For Input As f
 o Until EOF(f)
s = Asc(Input(1, #f))
Loop
MsgBox s
Close
End Sub
И увидишь, что символ 0 VB при вводе из текстового файла вообще игнорирует, а символ с кодом 26 считает концом файла. Это еще со времен Turbo Basic так: все .bas, созданные им, оканчивались на символ 26.
Отсуда же и рецепт: открывай файл в двоичном режиме.
Номер ответа: 6
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #6
Добавлено: 12.08.04 11:38
to Sharp: ну чё тут сказать, сколько пишу и всё удивляться не перестаю Вот ведь мелкомягкие дают... Я так думаю, что это только ВБ так считает?
Номер ответа: 7
Автор ответа:
NovichoK
Вопросов: 72
Ответов: 147
Профиль | | #7
Добавлено: 12.08.04 16:54
Да, вот только файл размером в 33Мб и считывать мне надо определеныне символы определенной строки...
Возможно кто-то подскажет другое решение этой задачи?
Возможно ли к примеру перезаписать определнную строку файла?
Номер ответа: 8
Автор ответа:
NovichoK
Вопросов: 72
Ответов: 147
Профиль | | #8
Добавлено: 12.08.04 16:56
Я не договорил:такие строки всречаются часто и редактировать их руками среди 900 000 строк напрягает...
Номер ответа: 9
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #9
Добавлено: 12.08.04 18:05
Открывай файл в двоичном режиме, как было сказано выше (Sharp). Ниччего править не надо
Номер ответа: 10
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 12.08.04 19:21
Ну зачем же руками. Если они тебе действительно не нужны, тогда просто считай весь файл в двоичном режиме и напиши процедурку убивающую эти символы. Тем же Split'ом можно или Instr + MID$ (Instr + Replace).
Спихни всё это дело обратно и наслаждайся чтением в последовательном доступе.
Номер ответа: 11
Автор ответа:
Kodo
Разработчик Offline Client
ICQ: 293048085
Вопросов: 37
Ответов: 457
Профиль | | #11
Добавлено: 12.08.04 19:26
1) Юзать Input в Loop это глупо, лучше уж Line input ...
2) А вообще считывай файл вот так :
Private Function ReadFileText(ByVal sFile As String, ByRef sText As String) As Boolean
On Error GoTo ErrorHandler
 im iFile As Integer
iFile = FreeFile
Open sFile For Binary Access Read Lock Write As #iFile
sText = Space$(LOF(iFile))
Get #iFile, , sText
Close #iFile
ReadFileText = True
Exit Function
ErrorHandler:
ReadFileText = False
End Function
все ето происходит гораздо быстрее, чем с Loop'ом! А дальше Split'ом все это Щастье делишь на строчки и считываешь че тебе надо было с отдельных строк отдельные символы. Вот и все.
Номер ответа: 12
Автор ответа:
NovichoK
Вопросов: 72
Ответов: 147
Профиль | | #12
Добавлено: 12.08.04 21:58
Я тут покопался в архиве и нашел снова таки совет Sharp'а насчет считывания в двоичном режиме:АПИшки CreateFile, WriteFile, ReadFile, CloseHandle - работают довольно шустренько, как для файлов такого размера: за 15 сек считывает предыдущий файл и перезаписывает информацию в новый файл.
Еще раз спасибо за советы всем!
>1) Юзать Input в Loop это глупо, лучше уж Line >input ...
Это почему же глупо?Какя разница: что тот, что другой оператор берет строку и помещает её в переменную.
Я вооще не улавлваю разницу между ними двумя...
Номер ответа: 13
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #13
Добавлено: 12.08.04 22:09
> Вот ведь мелкомягкие дают... Я так думаю, что это только ВБ так считает?
> Это еще со времен Turbo Basic так: все .bas, созданные им, оканчивались на символ 26
Между Input и Line Input разница следующая: считывая символ (или группу символов) VB выделяет память каждый раз (ну, не совсем так, но чисто примитивно...) и делать так - значит тестировать производительность и продуманность менеджера памяти. А в MSVS он отнюдь не блещет (как это ни печально, лучший из широкораспространенных компиляторов менеджер памяти у BCB). Считать все сразу в текстовую строку - это лучше, но не намного, потому что хотя памяти выделяется сразу 33 метра, она, скорее всего, сразу засвопится и доступ к ней будет замедлен. Поэтому самое лучшее для такого файла - замаппить его CreateFileMapping. Как говорили мне осведомленные люди, с маппингом Винда справляется очень неплохо.
Номер ответа: 14
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #14
Добавлено: 12.08.04 22:21
А эти "осведомленные люди" тебя примером не угостили случайно.
Номер ответа: 15
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #15
Добавлено: 12.08.04 22:37
От тебя, CyRax, я такого не ожидал! Как ты мог забыть дядю Iczelion'а, урок 13!