Что нового

[Данные, строки] Не удается получить содержимое файла (из за символа Chr(0) ).

beve

Осваивающий
Сообщения
104
Репутация
30
Мне нужно произвести обработку некоторого htm документа. Проблема в том, что в этом документе встречается символ, который не дает прочитать документ до конца, в результате при открытии файла для чтения, в переменной оказывается только текст от начала документа и до этого символа.
Помогите. Как прочитать текст (для примера я составил), который в прикрепленном файле, и вывести его в msgbox-е для наглядности?
 

SyDr

Сидра
Сообщения
651
Репутация
158
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

Побайтово. С обработкой нулевого байта.
Код:
$File = FileOpen("test.txt", 16)
dim $msg, $t
While 1
	$t = FileRead($file, 1)
	If @error Then ExitLoop
	If $t <> 0x00 Then $msg &= BinaryToString($t)
WEnd

MsgBox(4096, "", $msg)
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

не успел )) но вот тоже как вариант:
Код:
$sText = FileRead("test.txt")
$sBin = StringToBinary($sText)
$sText2 = BinaryToString($sBin)
$sText3=""
$i=1
For $i =1 to BinaryLen($sBin)
	$buf = BinaryMid($sBin,$i,1)
	If $buf = 0x00 Then
		$sText3 = $sText3&" "
	Else
	$buf2 = BinaryToString($buf)
	$sText3 = $sText3&$buf2
	EndIf
Next
MsgBox(0,"",$sText3)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

Код:
$h = FileOpen(@ScriptDir & '\test.txt', 16)
$a = FileRead($h)
If Mod(StringInStr($a, '00'), 2) = 1 Then
	$a = StringReplace($a, '00', '')
EndIf
MsgBox(0, '', BinaryToString($a))
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

Kaster
с твоего позволения, так будет еще компактнее:
Код:
$h  = FileOpen(@ScriptDir & '\test3.txt', 16)
$a = FileRead($h)
If StringInStr($a,'00') = True Then $a = StringReplace($a, '00', '')
MsgBox(0, '', BinaryToString($a))
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

Guezt
особенно если старшие четыре бита предыдущего и младшие 4 бита последующего байтов тоже нули. я поэтому поставил условие на то, чтобы 00 шел именно с нечетной позиции
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

Kaster
Да но обрабатывается по байту в данном примере нет?! Если не сложно, приведи пример файла, где не обработается мой вариант?


Добавлено:
Сообщение автоматически объединено:

Так, все разобрался, действительно "режит" предыдущие и последующие. :(
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

Код:
$a = '0x20CDE0F7E00BEE20F2E5EAF1F2E02028002920EAEEEDE5F62002E5EAF1F2E02E0D0A'
If StringInStr($a, '00') Then
	$b = StringReplace($a, '00', '')
EndIf
ConsoleWrite($a & @CRLF & $b & @CRLF)

Получишь следующий ответ
[box title=TitleBox]0x20CDE0F7E00BEE20F2E5EAF1F2E02028002920EAEEEDE5F62002E5EAF1F2E02E0D0A
0x20CDE0F7EBEE20F2E5EAF1F2E020282920EAEEEDE5F622E5EAF1F2E02E0D0A[/box]
обрати внимание на парные нули в изначальном тексте. хотя они и стоят рядом, но на самом деле это 4 бита от разных байтов. а заменить нужно именно нулевой байт. то-есть 00 - должен начинаться именно с нечетной позиции
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

Kaster
Хм, Вот пример файла где твой код не работает:
http://bag.dax.ru/test.txt
так что у SyDr думаю самый оптимальный вариант получился.


Добавлено:
Сообщение автоматически объединено:

p.s. как прикрепить файл? на форуме к сообщению?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

Guezt [?]
Хм, Вот пример файла где твой код не работает:
вообще-то на этом файле не работает твой код. вернее как раз таки работает - удаляет смежные нули, хотя они от разных байт. мой ничего не удалит. т.к. в этом файле нет нулевого байта
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

Kaster
Извини перезалил файл просто точку убрал в тексте и сам посмотри результат. :wacko:


Добавлено:
Сообщение автоматически объединено:


Странно сайт меняет 00 на 20 в тексте хм.. сейчас выложу в архиве.
http://ggmoto.narod.ru/test.rar
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

да. действительно. если в файле есть и нулевые байты, и просто смежные нули от разных байт, то мой скрипт не будет отличаться от твоего. посему, согласен, что наиболее оптимальным будет код предложенный SyDr
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
30
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

Kaster [?]
посему, согласен, что наиболее оптимальным будет код предложенный SyDr
Оптимальный, но чтоб обработать большой файл, приходится дооолго ждать...
Попробовал выйти из положения так, чтоб быстро проверить, есть ли совпадения или нет, то если есть такое сходство в коде то уже никуда не денешся, подождать, а если нету, то использовать обычное открытие для чтения файла...НЕ вышло:
если так
Код:
If Mod(StringInStr($a, '00'), 2) = 1 Then Msgbox(0,"","есть")
, то видит совпадение только в маленьком файле, в большом, где это совпадение есть, не видит...
а если так
Код:
If StringInStr($a, '00')= True Then Msgbox(0,"","есть")
, то видит совпадение даже там, где его нету (причину, вы разобрали)...
Спасибо, за обсуждение. Хотя жалко, что придется читать побайтово, это долго, но зато без ошибок.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

читает в переменную весь файл (для надежности в FileRead можно указать второй параметр), теряется при дальнейшей обработке, можно сразу проверить или заменить на пробел:
Код:
StringReplace(FileRead("C:\test.htm"), Chr(0), " ")
 

SyDr

Сидра
Сообщения
651
Репутация
158
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

beve, насколько большой файл?
Из таких символов там только 0x00?
Сколько там может быть таких символов?

Хотя, похоже, у amel27 самое лучшее решение...
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
30
Re: [Данные, строки] Не удается получить содержимое txt файла от начала до конца.

SyDr [?]
Хотя, похоже, у amel27 самое лучшее решение...
Работает! Причем быстро! amel27, большое спасибо.
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
Помогите прочитать файл в строковую переменную, чтобы потом можно было его записать через filewrite и данные не потерялись.
Для теста прикладываю файл.
Для чего это нужно: файл посылается по сети в строковом виде т.к. принимающая сторона может только такой тип обработать.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
r35p3ct
чет я не понял иронии... обычный текстовый файл. читаешь через fileread, пишешь через filewrite. в чем подвох?
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
С обычным текстовым все понятно по пред. сообщениям,а с zip или exe, такой фокус не проходит.
Целью является загрузка файла на сайт POST запросом, в бинарном виде все норм посылается, но в строковом выходит косяк. Вот и хочется понять как же это сделать. Да и почему Autoit криво обрабатывает этот байт?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
r35p3ct
Так попробуйте:
Код:
$hFileOld = FileOpen("d.zip", 16)
$sText = FileRead($hFileOld)
FileClose($hFileOld)
$hFileNew = FileOpen("d_1.zip", 18)
FileWrite($hFileNew, $sText)
FileClose($hFileNew)

Exe-файлы так тоже можно читать - записывать.
 
Верх