Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: www.rascalspb.narod.ru
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #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
    ;Do 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-сайт: www.rascalspb.narod.ru
 Профиль | | #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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #9
Добавлено: 12.08.04 18:05
Открывай файл в двоичном режиме, как было сказано выше (Sharp). Ниччего править не надо

Ответить

Номер ответа: 10
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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
   ;Dim 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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #14
Добавлено: 12.08.04 22:21
А эти "осведомленные люди" тебя примером не угостили случайно.

Ответить

Номер ответа: 15
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #15
Добавлено: 12.08.04 22:37
От тебя, CyRax, я такого не ожидал! Как ты мог забыть дядю Iczelion'а, урок 13!

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам