Инструкция OPEN Для чтения записи

Программирование на Visual Basic for Applications
SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Инструкция OPEN Для чтения записи

Сообщение SLIM » 22.04.2008 (Вт) 19:50

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

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

Еще существует FileSystemObject. Но он работает только с текстовыми файлами, а мне нужно считывать не с расширением TXT.
У кого какие могут возникнуть ответы на ситуацию подмогите....
Пишите жизнь на чистовик.....переписать не удастся.....

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 23.04.2008 (Ср) 7:16

1) если я правильно поял, то :

открыть файл
считать строку
если что, то сделать с ней что-то
записать строку в другой файл
переименовать полученный файл

2) FileSystemObject работает не только с текстовыми файлами
плюс к этому существует такой объект как STREAM
I Have Nine Lives You Have One Only
THINK!

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

Сообщение alibek » 23.04.2008 (Ср) 7:58

Open ... As Binary
Однако если ты работаешь с текстовыми по сути файлами, лучше воспользуйся первым советом HandKot.
Lasciate ogni speranza, voi ch'entrate.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 23.04.2008 (Ср) 18:02

открыть файл
считать строку
если что, то сделать с ней что-то
записать строку в другой файл
переименовать полученный файл


В том то и дело, что записывать в другой файл не нужно. Нужно изменить именно в этом.
В случае если перезаписывать в другой файл, то нужна еще одна инструкция open for outpu
Просто я так понимаю, чтобы делать это в этом же файл нужно дважды его открывать : один раз для вывода, другой раз для ввода. Тогда для ввода необходимо наити номер позиции чтобы заменить строку. Тогда прирываем считывание. Короче никак у меня не вышло.
А вот если создать переопределяемый массив (я ведь не знаю сколько строк будет), зацыклить можно поработать над строками в массиве, а потом перезаписать существующий файл.
О замутил :?
Пишите жизнь на чистовик.....переписать не удастся.....

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Сообщение anvg » 24.04.2008 (Чт) 3:12

SLIM
А вот если создать переопределяемый массив (я ведь не знаю сколько строк будет), зацыклить можно поработать над строками в массиве

Код: Выделить всё
    Dim fso As New Scripting.FileSystemObject
    Dim pStream As Scripting.TextStream
    Dim FileData As String, Lines() As String
   
    Set pStream = fso.OpenTextFile("d:\path\myfile.myext", ForReading)
    FileData = pStream.ReadAll
    pStream.Close
    Lines = VBA.Split(FileData, VBA.vbCrLf)
    '...

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 24.04.2008 (Чт) 20:14

Dim pStream As Scripting.TextStream

В том то и дело что помоему это для работы с текстовыми файлами. Он не откроет
Set pStream = fso.OpenTextFile("d:\path\myfile.myext", ForReading)


И к тому же
FileData = pStream.ReadAll
читает весь файл. А нужно именно по строкам, ибо данные содеожатсь постоянно только в одной строке. Мне только ее и нужно записать.
Да и вообще. Все это для чтения. Это только пол беды. Нужно ПЕРЕЗАПИСАТЬ с ОДНИМ открытием. Будь то инструкция OPEN либо объекты FILESYSTEMOBJECT. Неважно.
Просто если два раза открывать для перезаписи, я так понимаю код будет работать медленнее чем если считывать в массив.
Вот пример

Код: Выделить всё
ReDim Arr(1) As String
    Dim IArr As Integer
   
    Open PathFile & "\" & Name For Input As #1
    IArr = 1
    Do While Not EOF(1)
        Line Input #1, str
        Arr(IArr) = str
        IArr = IArr + 1
        ReDim Preserve Arr(IArr) As String
    Loop
    Close #1


Вроде быстро работает.
Так кто нибудь знает как с одной инструкции открыть для записи и чтения?
Пишите жизнь на чистовик.....переписать не удастся.....

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Сообщение anvg » 25.04.2008 (Пт) 15:18

SLIM
читает весь файл

А дальше смотрел?
Разбиваем всё считанное по строкам по признаку перевода строки в массив без всяких Preserve
Код: Выделить всё
Lines = VBA.Split(FileData, VBA.vbCrLf)

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 25.04.2008 (Пт) 16:55

Прикольно. :lol:
Тем ни менеее задача не достигнута.
Пишите жизнь на чистовик.....переписать не удастся.....

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 25.04.2008 (Пт) 17:08

Да никак.
Одновременно на чтение и запись файл открыть нельзя. (Input+Output)

Опять же, тебе шашечки, или ехать? Чего ты хочешь добиться?
Правильный способ же подсказали... Если конечно, я правильно понимаю твою задачу.

Можно For Binary. Так можно будет и читать и писать.
Но тогда сам будешь следить за указателем, сам писать и читать по строке. Правда в этом случае, если изменится длина строки - затрешь начало следующей, т.е. еще и за этим придется следить...

Читай в массив - работай с ним. Пиши обратно.
Или Stream.

З.Ы. то, что оно называется "Scripting.TextStream" совершенно не значит, что оно не открывает "не .txt". У тебя же внутри обычный текст, так?
label:
cli
jmp label

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 25.04.2008 (Пт) 17:30

Правда в этом случае, если изменится длина строки - затрешь начало следующей, т.е. еще и за этим придется следить...

Эт точно

З.Ы. то, что оно называется "Scripting.TextStream" совершенно не значит, что оно не открывает "не .txt". У тебя же внутри обычный текст, так?

Прально. Просто я както раз пробовал, у меня ошибка вылезла. Глубоко капаться не стал, но показалось, что из-за не.тхт.
Мож ошибся. Ща попробую.
Пишите жизнь на чистовик.....переписать не удастся.....

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 05.05.2008 (Пн) 7:23

тут возникла похожая проблема вот код

Код: Выделить всё
Public Sub Test()
    Dim N As String * 10
    Open Path & "e:\111\test.txt" For Random Access Read Write As #1 Len = Len(N)
    i = 1
    While Not EOF(1)
        'читпем строку
        Get #1, i, N
        If N = "эту меняем" Then
            'пишем
            N = "уже сменил"
            Put #1, i, N
        End If
        i = i + 1
    Wend
    Close #1
End Sub


ЗЫЖ ограничения есть, но можно и обойти возможно
I Have Nine Lives You Have One Only
THINK!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 05.05.2008 (Пн) 10:56

При условии, что длина строки фиксированная...
label:
cli
jmp label


Вернуться в VBA

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

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

    TopList