Длина строки

Программирование на Visual Basic for Applications
Eugene
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 08.01.2005 (Сб) 12:06

Длина строки

Сообщение Eugene » 17.02.2006 (Пт) 18:00

Приветствую форумян.

Насколько я понял - в VBA строковая переменная не может содержать более 250 символов. Посчитал - вроде 250 а не 255\256, хотя это не принципиально - мне нужно прочитать построчно из файла строки - более 500 символов.

Line Input #1, InputData(i) - переменная не хочет запоминать больше 250 символов

Подскажите, плз, как решить эту проблему?

Mech
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 07.02.2006 (Вт) 20:37
Откуда: г. Лобня

Re: Длина строки

Сообщение Mech » 17.02.2006 (Пт) 20:34

Eugene писал(а): Line Input #1, InputData(i) - переменная не хочет запоминать больше 250 символов


надо читать файл посимвольно и если там найдется Chr(13) - сивол перехода на новую строку - то выводить количество символов и обнулять переменную числа символов в строке :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.02.2006 (Сб) 5:13

Глупость и то, и другое.

Если построчно - то именно line input.
И если переменная as string, значит строки в файле реально по 250 символов.
Если, конечно, эти строки не лицезрятся через watch window. Там ограничение на отображение. Которое не влияет на содержимое строки никак.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugene
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 08.01.2005 (Сб) 12:06

Сообщение Eugene » 18.02.2006 (Сб) 8:54

To GSerg
Это все, конечно хорошо - но вот только проблему-то как решить?
Переменная была и как string и как variant - разницы нет.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.02.2006 (Сб) 11:00

GSerg писал(а):И если переменная as string, значит строки в файле реально по 250 символов.



GSerg писал(а):Если, конечно, эти строки не лицезрятся через watch window. Там ограничение на отображение. Которое не влияет на содержимое строки никак.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugene
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 08.01.2005 (Сб) 12:06

Сообщение Eugene » 18.02.2006 (Сб) 11:59

To GSerg

Я знаю, что длина в watch window - не связана с фактической длинной переменной
Только у меня в самом файле - строки больше 250 символов!
В целом задача такая - прочитать файл и в конец каждой строки добавить еще инфы. Итого должен получиться файл с еще более длинной строкой - таких добавлений может быть достаточно много, поэтому теоретически длина строки может быть очень длинной - например 500 символов.

Файл прикрепил в аттач

Надеюсь на помощь
Вложения
test.rar
(423 байт) Скачиваний: 55

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.02.2006 (Сб) 12:17

Свой код приведи. Вместе с открытием файла и объявлением переменных.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugene
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 08.01.2005 (Сб) 12:06

Сообщение Eugene » 18.02.2006 (Сб) 13:39

To GSerg

Слушай, я только что разобрался - файлы нормально читаются и записываются. Вот только мне приходится сначала читать (Open for Input) файл и запоминать каждую строку. Потом записывать (Open for Output) в этот же файл каждую строку с уже добавленной инфой.
Можно ли сделать это одновременно открывая файл for Random?
Не могу понять как работает ф-я Get
В справке написано:
Syntax
Get [#]filenumber, [recnumber], varname
и пример: Get #4,,FileBuffer

копирую пример в код - и мне выдается ошибка
Bad record length (Error 59)

иду в справку по этой ошибке - написано, мол:

The length of a record variable in a Get or Put statement must be the length specified in its corresponding Open statement. This error has the following causes and solutions:
...
Open MyFile As #1 Len = Len(RecVar)

Ок ввожу это в код - и мне выдается ошибка
Invalid procedure call or argument (Error 5) - и указывает на строку "Open MyFile As #1 Len = Len(RecVar)"

Вообщем если не сложно - вкратце как она работает все-таки.

P.S. Посмотрел поиск не форуме по ф-и Get. Единственная найденная ссылка, к-я могла бы помочь - это http://www.vbstreets.ru/VBdotNET/Upgrade/66062.aspx, но это не то

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.02.2006 (Сб) 14:24

Eugene писал(а):Слушай, я только что разобрался - файлы нормально читаются и записываются. Вот только мне приходится сначала читать (Open for Input) файл и запоминать каждую строку. Потом записывать (Open for Output) в этот же файл каждую строку с уже добавленной инфой.
Можно ли сделать это одновременно открывая файл for Random?

Нет.
(Я правильно понял, что ты вставляешь текст между строками?)
Изображение

Eugene
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 08.01.2005 (Сб) 12:06

Сообщение Eugene » 18.02.2006 (Сб) 15:02

Нет, я прибавляю к существующей строке еще несколько символов. Т.е. изменяется только окончание и, соот-но, длинна считанной строки, новых строк не появляется.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.02.2006 (Сб) 15:15

В файле нет строк. В файле есть сплошной поток байтов. То, что человек хочет думать, что байт 0x0D должен означать перевод строки, не значит, что он означает его для файловой системы.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mech
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 07.02.2006 (Вт) 20:37
Откуда: г. Лобня

Сообщение Mech » 20.02.2006 (Пн) 0:57

Eugene писал(а):Можно ли сделать это одновременно открывая файл for Random?

нет, если у тебя строки разной длины, даже если у тебя были строки одинаковой длины, то при дописывании, длина записей изменится

Eugene писал(а):Не могу понять как работает ф-я Get


функция Get используется для файлов с произвольным доступом.. что это такое, и как это отличить от бинарных и последовательных файлов?
В последовательном файле вся информация хранится в одном длинном массиве, например ты набрал в три строки

Вася
Петя
Коля

В файле они будут лежать так НАЧАЛО ФАЙЛАВася/nПетя/nКоля/n КОНЕЦ ФАЙЛА

"/n" - непечат. символ(один) перехода на новую строку, он же символ возврата каретки (код ANSI - 13) = Chr(13) = vbCRlf

Последовательные файлы так наз потому, что их записи всегда читаются последовательно от начала файла.

Двоичные файлы- это тоже последовательные, но там хранится не текст, а неинформативная последовательность байтов ( программы в том чилсле, их плюс - быстрее читаются, меньше памяти жрут)

Файлы с произвольным доступом- сохраняет записи ФИКСИРОВАННОГО РАЗМЕРА. Размер каждой записи определяется в момент создания файла. Нумеруются последовательно начиная с нуля. НЕ используются разделители. Плюс в том, что можно обратиться сразу к 1001 записи, минуя 1000 до этого. Минус - Фиксированная ширина поля:

Последовательный файл, который мы сохранили в блокноте

Вася/nПетя/nМарина/nКоля

Файл открыт для произвольного доступа с шириной = 5

Вася/n
Петя/n
Марин
а/nКол
я

Файл открыт для произвольного доступа с шириной = 4

Вася
/nПет
я/nМа
рина
/nКоля

Файл открыт для произвольного доступа с шириной = 6 ( Чтобы Марина влезла)
Вася/nП
етя/nМа //Ну почти влезла :)
рина/nК
оля

Чувствуешь разницу? :-D :lol:
Маза использовать произвольный доступ в хранении структур ( классов) которые будут ФИКСИРОВАННОЙ Длины или используй заполнители лишнего, например пробелами


Как работает Get:
Открыли с длиной = 5
Код: Выделить всё

Dim str$
Dim fn%
fn=FreeFile()
Open "cpp.txt" For RANDOM As #fn LEN=5


Вася/n
Петя/n
Марин
а/nКол
я

Код: Выделить всё

Get #fn, 2, str

Если посимвольно перебрать строку str, и распечатать ANSI коды, то мы получим
[код буквы П] // мне влом было смотреть, для этого есть ф-я Asc()
[код буквы е]
[код буквы т]
[код буквы я]
[код 13]

Да, курсор файлового указатеря теперь находится возле строки 2+1=3 строки


А теперь что тебе нужно в реале
1. Купить учебник по VBA
2. Открыть раздел Доступ к файлам
3. Прочитать ВСЕ :)


После этого код должен получиться что-то вроде этого
Код: Выделить всё

Dim str$
Dim fn1%,fn2

fn1=FreeFile()
Open "First.txt" For input As #fn
fn2=FreeFile()
Open "Second.txt" For Output As #fn

// посимвольный цикл
Do while not EOF(fn1)
   str=Input 1, fn1
   if str <> Chr(13) then
     print #fn2, str
   else
     Print #fn2,"что-то еще" ;   
         // ";" - значит печатать "что-то еще " и добавить /n
   endif
wend

close #fn1,#fn2


Если надо чтобы и second.txt заменил first.txt, то в том же учебнике, ты найдешь как удалить файл и потом переименовать :)

Приятного дня!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.02.2006 (Пн) 8:07

Mech писал(а):"/n" - непечат. символ(один) перехода на новую строку, он же символ возврата каретки (код ANSI - 13) = Chr(13) = vbCRlf [/b]

Неверно. В Windows это не Chr$(13), а Chr$(13)+Chr$(10).
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.02.2006 (Пн) 10:44

alibek писал(а):
Mech писал(а):"/n" - непечат. символ(один) перехода на новую строку, он же символ возврата каретки (код ANSI - 13) = Chr(13) = vbCRlf [/b]

Неверно. В Windows это не Chr$(13), а Chr$(13)+Chr$(10).

Не говоря уже о том, что "\n" = Chr(10) = vbLf (и слеш именно обратный!)
Не говоря уже о том, что символ перехода на новую строку и символ возврата каретки -- это два разных символа ещё со времён телетайпов.
Mech жжот: в одной строчке четыре ошибки.
Изображение

Mech
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 07.02.2006 (Вт) 20:37
Откуда: г. Лобня

Сообщение Mech » 20.02.2006 (Пн) 13:35

:oops: :oops: :oops:

Не бейте ногами!!

Тёмыч
Сорри :oops:, совершенно забыл, что слеш именно обратный, а как я припоминаю, 13 - это косой ноль("\0")? да?

Ко всем:
А я еще перепутал, что точка с запятой - наоборот не заставляет перехоидь на новую строку!

:roll:
Женя, не буду издеваться, вот код, проверял:))
Код: Выделить всё

Private Sub Кнопка0_Click()
Dim str$
Dim fn1%, fn2

fn1 = FreeFile()
Open "c:\First.txt" For Input As #fn1
fn2 = FreeFile()
Open "c:\Second.txt" For Output As #fn2

While Not EOF(fn1)
   str = Input(1, fn1)
   Debug.Print "<" & str & ">= " & Asc(str) & " Код"
   If (str <> Chr(13)) And (str <> Chr(10)) Then
     Print #fn2, str;
   Else
     If str = Chr(13) Then
        Print #fn2, "что-то еще"
     End If
   End If
Wend

Close #fn1, #fn2
End Sub
:oops:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.02.2006 (Пн) 13:50

\0 - null
\r - CR, Carriage Return, перевод каретки
\n - LF, Line Feed, перевод строки
\t - TAB, табулятор
Lasciate ogni speranza, voi ch'entrate.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 68

    TopList  
cron