Замена одного символа

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Hlyn
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.08.2006 (Ср) 18:10

Замена одного символа

Сообщение Hlyn » 09.08.2006 (Ср) 18:32

Есть такая проблема:идет большой трафик определенных файлов, размер каждого может достигать полугига, но машина формирующая эти отчеты (файлы) переодически начинает сбоить, а именно меняет первый символ в файле на 00 (16) вместо положеного A5 (16). Задумал написать програмулину, но столкнулся с проблемой как написать блок IF который вытаскивает только 1 первый символ проверяет его на подлинность и если необходимо заменяет на правильный. Пытался с помощью PUT# и GET# какая-то хрень выходит и машина тормозит сильно. Подскажите что тут можно придумать. Сам я не програмер, замучился уже кривоту выправлять.
Чужие здесь не ходят

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.08.2006 (Ср) 20:14

Вытаскиваение первого символа из строки:
Код: Выделить всё
first_symbol = Mid$(stroka, 1,1)


Из файла:
1)
Код: Выделить всё
Dim first_symbol as String
Open "file.dat" For Binary as #1
first_symbol = Space(1)
Get #1, 1, first_symbol
Close #1

2)
Код: Выделить всё
Dim first_symbol_asc as Byte
Open "file.dat" For Binary as #1
Get #1, 1, first_symbol_asc
first_symbol = Chr(first_symbol_asc)

3)
Код: Выделить всё
Dim first_symbol as String * 1
Open "file.dat" For Binary as #1
Get #1, 1, first_symbol
Close #1

4)
Код: Выделить всё
Dim filedata as String
Open "file.dat" For Binary as #1
filedata = Space(LOF(1))
Get #1, 1, filedata
Close #1
first_symbol = Mid$(filedata, 1, 1)


На выбор... любой...

ЗЫ. Интересно, придерётся ли GSerg к тому, что я вместо FreeFile(), единственный раз на этом форуме использовал "1".
Последний раз редактировалось Хакер 09.08.2006 (Ср) 20:58, всего редактировалось 1 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Hlyn
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.08.2006 (Ср) 18:10

Сообщение Hlyn » 09.08.2006 (Ср) 20:56

Век живи, век учись. Спасибо за помощь.
Чужие здесь не ходят

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 10.08.2006 (Чт) 5:19

Хакер писал(а):ЗЫ. Интересно, придерётся ли GSerg к тому, что я вместо FreeFile(), единственный раз на этом форуме использовал "1".
Нет, придерусь я, ибо нефиг новичкам заведомо кривой код подсовывать... :roll:

Надо примерно так:
Код: Выделить всё
dim ff as Integer
ff = FreeFile
open "myfile.txt" for bynary as #ff
'...
close #ff


PS. Ну не вставляют меня новые расцветки форматирования кода...
А я все практикую лечение травами...

Hlyn
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.08.2006 (Ср) 18:10

Сообщение Hlyn » 10.08.2006 (Чт) 20:12

Что то хрень какая-то. Ну написал, проверяет правильно, а вот при замене глюк, почему-то меняет 3 байт а не 1.
Код: Выделить всё
Dim first_symbol As String * 1
Open "1.txt" For Random As #1
Get #1, 1, first_symbol
List1.AddItem first_symbol
Close #1
    If first_symbol <> "5" Then
    Open "1.txt" For Random As #1
    Put #1, 1, "5"
    Close #1
    Open "1.txt" For Random As #1
    Get #1, 1, first_symbol
    List2.AddItem first_symbol
    Close #1
    End If

Подскажите кто знает, пожалуйста.
Чужие здесь не ходят

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.08.2006 (Чт) 20:25

As Random?
В коде, который я тебе дал , ты видел это?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 10.08.2006 (Чт) 21:40

Hlyn А зачем такие сложности, по нескольку раз открывать и закрывать файл
Так наверное короче.
Код: Выделить всё
Dim first_symbol As String * 1, filenum As Integer
filenum=FreeFile ' Определяем свободный номер для открытия файла
Open "1.txt" For Binary As #filenum
  Get #filenum, 1, first_symbol  ' Читаем первый символ
  List1.AddItem first_symbol 
    If first_symbol <> "5" Then  ' Проверяем
      Put #filenum, 1, "5"  ' Если символ не тот, то меняем на нужный
    end if
  Get #filenum, 1, first_symbol  ' Снова читаем из файла первый символ (наверно для проверки, а так это лишнее)
  List2.AddItem first_symbol
Close #filenum  '
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.08.2006 (Чт) 21:45

Я вообще нахожу этот код тупым.
Код: Выделить всё
If first_symbol <> "5" Then  ' Проверяем
      Put #filenum, 1, "5"  ' Если символ не тот, то меняем на нужный
    end if


Какой смысл проверять? Надо писать 5 просто и всё.

Потом. Какой смысл после этого делать
Код: Выделить всё
Get #filenum, 1, first_symbol

Если после предыдущего кода, в файле на первой байте хоть как будет "5" ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 10.08.2006 (Чт) 22:14

Хакер Я не спорю что можно вообще не проверять, а сразу писать нужный символ во все получаемые файлы.
Открыл, сразу записал, закрыл. И не важно что там был за символ, в итоге получаем все файлы с правильным первым символом.
Я намеренно оставил лишнее, что-бы Hlyn смог разобраться что происходит с его файлами.
Код: Выделить всё

Dim first_symbol As String * 1, filenum As Integer
filenum=FreeFile
Open "1.txt" For Binary As #filenum
   Put #filenum, 1, "5"  ' Сразу меняем на нужный
Close #filenum 

Теперь код не вызывает нареканий?

PS. Ты Хакер наверное сам когда начинал программировать постоянно следил за каждым простейшим шагом в своей программе.
Когда человек научится и поймет механизм работы он уже сам будет писать короткие и оптимизированные коды.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.08.2006 (Чт) 22:20

Когда я начинал, меня никто не учил, и у меня не было книг и мануалов. И я учился долго. А здесь, есть люди, способные научить, и имеющие большой опыт (и таких тут много). Так почему бы не воспользоваться этим?

На счёт кода. Лучше записывать не "5" а CByte(Asc("5"))
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Hlyn
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.08.2006 (Ср) 18:10

Сообщение Hlyn » 10.08.2006 (Чт) 22:32

Xaker: ну лох я в этом, поправь если я не прав:если мы выходим на binary, то есть на двоичный код, вопрос а на хрена если нам нужен? символьный random работает с типа как с текстовыми файлами, подробности не помню книжка на работе осталась, а проблема в голове :lol: , но по идее это и нужно,наверно,а по поводу Binary eсть проблема, если его ставишь меняет 5 байт в файле...а random 3...глюконат кальция
Glyckmen Аддлисты это чисто проверка,ты прав, забыл удалить когда код выкладывал,но все равно спасибо.
Нет я согласен я что-то не знаю, но хочу разобраться.
Чужие здесь не ходят

Hlyn
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.08.2006 (Ср) 18:10

Сообщение Hlyn » 10.08.2006 (Чт) 22:38

P.S.Пока писал соообщение 2 последних поста не видел...сорри
Чужие здесь не ходят

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.08.2006 (Чт) 23:47

Binary даёт тебе возможность правки любого байта или последовательности байтов. Random тебе ничего хорошего не даёт :lol:

Вот этот код
Код: Выделить всё
Dim first_symbol As String * 1, filenum As Integer
filenum = FreeFile
Open "c:\1.txt" For Binary As #filenum
   first_symbol = "5"
   Put #filenum, 1, first_symbol
Close #filenum


работает отлично и меняет столько, сколько надо.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 11.08.2006 (Пт) 5:20

Какой смысл проверять? Надо писать 5 просто и всё.
Используя проверку можно сэкономить лишние пару тысяч тактов процессора... :wink:
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.08.2006 (Пт) 7:12

Ухты, как много 8)

Если перевести в мс?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 11.08.2006 (Пт) 10:11

Хакер писал(а):Ухты, как много 8)
Гм... Я, конечно, не буду доказывать что проверка обязательно нужна, но все же...
Сам погляди: Put так или иначе доберется до ntdll.dll!ZwWriteFile, та обратится к ядру, ядро обратится к драйверу файловой системы, драйвер фс обратится к драйверу диска, тот в свою очередь обратится к драйверу шины и лишь потом физически произойдет запись на винт. Прикинь сколько лишних движений! :lol:

ЗЫ Если что напутал или упустил в этой цепочке - поправьте меня, ок?
А я все практикую лечение травами...

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

Сообщение alibek » 11.08.2006 (Пт) 10:24

Twister, а прикинь, чтобы сравнить записываемое значение с "5" его вначале надо считать. И считать таки из файла. И как не странно, тоже обращаться к ядру, драйверу файловой системы, драйверу диска, драйверу шины и лишь потом физически произойдет чтение данных.
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 11.08.2006 (Пт) 12:44

alibek писал(а):Twister, а прикинь, чтобы сравнить записываемое значение с "5" его вначале надо считать. И считать таки из файла. И как не странно, тоже обращаться к ядру, драйверу файловой системы, драйверу диска, драйверу шины и лишь потом физически произойдет чтение данных.
Лол, Алибек. А я об этом и не подумал... :lol:
А я все практикую лечение травами...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.08.2006 (Пт) 14:21

Twister писал(а):Используя проверку можно сэкономить лишние пару тысяч тактов процессора... :wink:
Невежливо считать чужие такты :lol:
Лучший способ понять что-то самому — объяснить это другому.

Hlyn
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.08.2006 (Ср) 18:10

Сообщение Hlyn » 11.08.2006 (Пт) 17:10

Всем кто помогал и ругал большое спасибо. Все работает.
Чужие здесь не ходят


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 25

    TopList