Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мне нужно считывать из текстового файла фрагменты, Нужна помощь 
:(
    Опции темы
serezetdin
Дата 16.2.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 16.2.2006

Репутация: нет
Всего: нет



Есть такой вопрос -
Мне нужно считывать из текстового файла фрагменты в
программу. Фрагменты состоят из строк произвольной длины. Объем
фрагмента - 9 строк. всего фрагментов - 40.
Если открывать-закрывать файл индекс строки перемещается в
самое начало файла, и происходит постоянно закачка
первого фрагмента, а не строк с индексами 10-19 и т. д.
Как мне лучше это организовать?

Заранее спасибо

PM MAIL   Вверх
amt
Дата 16.2.2006, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 249
Регистрация: 26.10.2004
Где: г. Волгоград

Репутация: 3
Всего: 3



Если я не ошибаюсь, то чтение из текстового фойла можно производить только методом последовательного доступа. Т.е. нада просматривать последовательно строчку за строчкой.

Почитай здесь
Последовательный доступ
Последовательный доступ используется главным образом при работе
с текстовыми файлами. Любая информация считывается или
сохраняется в текстовом виде построчно. В тексте могут находиться
символ перевода строки (vbCrLf или chr (13) & Chr (10)) или табулятор
(vbTab или chr (9)). Эти символы используются для форматирования
текста.
Способ открытия файла с последовательным доступом (для чтения,
записи или добавления) задается при вызове оператора Open:
Open Имя_файла For [Input I Output I Append] As filehandle
Таблица 4.6. Различные операционные возможности для последовательного
доступа
Ключевое слово Описание
Input Открытие только для чтения иэ файла
Output Открытие для записи в файл
Append Открытие для добавления к файлу
Если файл не существует и открывается для чтения (For input), то Visual Basic
выдает сообщение об ошибке, а если для записи или добавления (Output или
Append), то создается новый файл. Если файл с указанным именем существует,
то в режиме Output его содержимое удаляется, а в режиме Append файл
открывается для добавления:
Код

Open "C:\README.TXT" For Input As intFHl 
Open "C:\DATA\TEXT.TXT" For Output As intFH2
 Open "C:\USERS.TXT" For Append As intFH3

В конце строки указывается номер канала, возвращаемый функцией FreeFile. В
некоторых операционных системах, например в Windows 95/98, можно испольZ
зовать длинные имена файлов.
Чтение из файла
Для считывания данных из файла, открытого для последовательного доступа,
существует несколько возможностей. В общем случае это осуществляется с
помощью оператора input, имеющего несколько разновидностей:
• Line lnput# считывает одну строку;
• I при t # считывает последовательность символов, обычно записанных с
помощью оператора Write#;
• input $ считывает определенное количество символов.
Существует несколько вариантов чтения всей информации из файла. Перед
чтением нужно открыть файл с помощью оператора Open.. . For:
Код

intFH = FreeFile Open "С:\Text.Txt" For Input As
intFH
'
1-ый вариант
Код

Do Until EOF(intFH)
Line Input #intFH, strString
strText = strText & strString & vbLf 
Loop
'
2-ой вариант
Код

StrText = Input$(LOF(intFH), intFH)
Close *intFH

Оба варианта приводят к одинаковому результату.
В первом варианте оператор Input выполняется в цикле, пока не будет
достигнут конец файла. Функция EOF (End Of File) возвращает значение True при
достижении конца файла. При этом на каждом шаге цикла считывается
отдельная строка и к ней добавляется символ конца строки, который
отбрасывается оператором Line input.
Во втором варианте весь файл считывается функцией lnput$.
Функция LOF (Length Of File) позволяет определить длину файла в байтах.
Заметим также, что независимо от вида оператора Input указывается
не Имя файла, а только номер канала, т.е. дескриптор файла (intFH).
Close
Оператор Close предназначен для закрытия открытого файла или
канала.
Запись в файл
В Visual Basic для записи информации в файл используются операторы
print# и Write».
Print»
Оператор Print# функционирует почти так же, как его "коллега" для экрана, с
той лишь разницей, что данные не выводятся на экран, а сохраняются в файле,
открытом для записи или добавления (Open.. .For Output или Open.. .For
Append).
Vfintffilehandle, [(Spc(n) I Tab[(n)]l] [expression] [charpos]
Синтаксис оператора на первый взгляд выглядит сложно:
Print #intFH, Textl.Text
Print #intFH, "Фрагмент I", " Фрагмент 2"
Print #intFH, "Это составляет "; "единое целое"
Для форматирования записываемой в файл информации следует поZразному
разделять данные в операторе print. Если в операторе данные разделять запятыZ
ми (,), то в файле они будут разделены символами табуляции:
Print #intFH, "Фрагмент I", " Фрагмент 2"
'соответствует
Print #intFH, "Фрагмент I"; Tab; "Фрагмент 2"
Если же в операторе для разделения данных использовать точку с запятой (;),
то данные в файл записываются без разделителей:
Print #intFH, "Это составляет "; "единое целое"
'соответствует
Print #intFH, "Это составляет единое целое"
Write»
Оператор Write# имеет такой же синтаксис, что и print#. Отличие
состоит только в форматировании вывода. Если Print» сохраняет данные
в виде обычного текста, то writer заключает текстовые строки в кавычки,
а цифры выводятся без кавычек:
Print #intFH, "Анна", "Киев", 17 ' в файле будет: Анна
Киев 17 Write #intFH, "Анна", "Киев", 17 ' в файле
будет: "Анна","Киев",17
Данные, сохраненные с помощью оператора write*, можно считать
оператором
Input».


Узнать позицию считывания можно с помощью ф-ии


Код


'For files opened in modes other than Random mode, Seek returns the byte position at which the next operation takes place. Assume TESTFILE is a file containing a few lines of text.

Dim MyChar
Open "TESTFILE" For Input As #1    ' Open file for reading.
Do While Not EOF(1)    ' Loop until end of file.
    MyChar = Input(1, #1)    ' Read next character of data.
    Debug.Print Seek(1)    ' Print byte position to the
            ' Immediate window.
Loop
Close #1    ' Close file.


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




Произвольный доступ
Доступ типа Random Access несколько утратил свое значение после
появления в версии Visual Basic 3.0 средств доступа к базам данным. В
отличие от последовательного доступа, при котором данные в файлах
хранятся в неструктурированном виде, произвольный доступ
предполагает, что файл имеет постоянную структуру. Это позволяет
считывать данные в произвольном порядке.
Произвольный доступ реализуется посредством оператора Open.
Open Имя_файла For Random [Acc««e Доступ] [Блокировка] As [#]HandJe [ben =
Длина_записи}
Параметр Len определяет длину записи. Если это значение меньше, чем
реальная длина записи, то возникает ошибка, если больше — то при записи
файла используется больше дискового пространства, чем необходимо.
Параметр Access позволяет задать права доступа к открываемому файлу.
Таблица 4.7. Виды доступа при произвольном доступе
Доступ Пример
Без указания Open "DATE.DAT For Random As intFH
Чтение (Read) Open "DATE.DAT' For Random Access Read As intFH
Запись(Write) Open "DATE.DAT' For Random Access Write As intFH
Чтение и запись
(Read Write)
Open "DATE.DAT' For Random Access Read Write As intFH
Если права доступа не указаны, то по умолчанию используется Read Write. Так
как этот тип доступа обычно предназначен для работы с файлами, которые
могут использоваться многими пользователями или приложениями, то следует
обеспечить целостность данных при коллективном использовании. Для этого
следует установить параметр Lock, определяющий права доступа к открытому
файлу. Этот параметр может принимать следующие значения:
• Shared
Файл может использоваться всеми процессами для считывания и записи.
• Lock Read
Никакой другой процесс не может считывать данные из файла. Данный
параметр можно установить, если в данный момент никакой другой процесс
не выполняет операцию чтения.
• Lock Write
Никакой другой процесс не может записывать данные в файл. Данный
параметр можно установить, если в данный момент никакой другой
процесс не выполняет операцию записи.
• Lock Read Write
Никакой другой процесс не может считывать или записывать. Данный
параметр можно установить, если в данный момент не выполняются
операции чтения или записи.
Параметр Len задает длину одной записи. Для задания длины можно
использовать функцию Len:
Open "ADDRESS.DAT" For Random Access Write As 1 Len = 27 Open
"ADDRESS.DAT" For Random Access Write As 1 Len = Len(Varname)
При этом важно, чтобы при открытии файла была известна длина набора
данных, что может быть проблематичным, если происхождение файла
неизвестно.
Ввод и вывод
Get, Put
Для записи и чтения данных используются соответственно операторы
put и Get.
Put #fS,lehandler, Ноыер_записи, Переменная Get
ffilehandler, Номер_эаписи, Переменная
В данном примере в файл записываются данные из переменной Addres s,
причем номер записи равен 7, а затем в переменную Address считывается вторая
запись файла.
Put #intFH, 7, Address 'сохраняет 7Zую запись Get #intFH,
2, Address 'считывает 2Zую запись
Для того чтобы в одной записи сохранить несколько значений различных
типов, следует использовать пользовательские типы данных:
Код

(General)(Declaration)
Type Person
FirstName As String * 20
Name As String * 20
CustomerN As Integer 
End Type
Private Customer As Person
'Процедура
Private Sub Commandl_Click()
intFH = FreeFile
Open "C:\LORE.DAT" For Random As intFH Len = Len(Customer)
Get tintFH, 2, Customer
Close #intFH 
End Sub


Это сообщение отредактировал(а) amt - 16.2.2006, 23:00
--------------------
С точки зрения банальной эрудиции не каждый индивидуум способен игнорировать тенденции парадоксальных эмоций.
PM MAIL   Вверх
Akina
Дата 17.2.2006, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(serezetdin @ 16.2.2006, 16:49 Найти цитируемый пост)
Объем фрагмента - 9 строк. всего фрагментов - 40.

При таком объеме - сразу считать весь файл в массив и не засорять себе голову.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0869 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.