Что нового

Ошибка с индексом массива

maxd2007

Новичок
Сообщения
89
Репутация
0
Здравствуйте, начал писать такой код

Код:
dim $mas[0]

$path = @ScriptDir & "\ReadUNIcode.txt"
$hFile = FileOpen ($path)
$CountLine = _FileCountLines ($path)
ReDim $mas[$CountLine]
$test = _ReadToArray ($CountLine, $hFile, $mas)


Func _ReadToArray ($CountLine, $hFile, $mas)
	For $i = 0 To $CountLine - 1 Step 1
		$mas[$i] = FileReadLine ($hFile, $i + 1)
	Next
	Return $mas
EndFunc

в строке
Код:
$mas[$i] = FileReadLine ($hFile, $i + 1)
ругается на неверный номер элемента массива, в текстовом файле 3 строки (но со временем туда надо будет добавлять строки), т.е. еще до входа в функцию я перераспределяю количество элементов массива, но в функции при попытке присвоить в первый элемент значение выдает ошибку, подскажите что я не так сделал?
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Спасибо _FileReadToArray() - помогло, но в чем проблема первого варианта я так и не понял, если поменять
Код:
$mas[$i] = FileReadLine ($hFile, $i + 1)
на
Код:
$mas[$i] = 1
то все работает


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

_FileReadToArray() к сожалению работает не так как мне надо, а именно он вносит в массив строки в кодировке ANSI, а мне нужно что бы они оставались в unicode (именно в этой кодировке они в ReadUNIcode.txt), поэтому функция которую я пытался написать выше для меня актуальней.


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

После того как убрал перевыделение массива (как Вы предложили выше), функция заработала как надо, спасибо.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
maxd2007 сказал(а):
_FileReadToArray() к сожалению работает не так как мне надо, а именно он вносит в массив строки в кодировке ANSI, а мне нужно что бы они оставались в unicode

Попробуйте использовать FileOpen и передавать дескриптор файла открытого в нужной вам кодировке
Код:
FileReadToArray()
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Ошибку выдает и в документации сказано "Path and filename of the file to be read.", т.е. дескриптор передавать нельзя((
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Tempo сказал(а):
maxd2007 сказал(а):
Ошибку выдает и в документации сказано "Path and filename of the file to be read.", т.е. дескриптор передавать нельзя((

В нативную функцию можно
FileReadToArray

Так же, в ANSI сохраняет((( FileReadLine кстати тоже сохраняет в ANSI так что моя функция бесполезна в данном случае, я думаю как вариант взять массив и каждый элемент переделать в юникод
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Tempo сказал(а):
maxd2007 сказал(а):
Так же, в ANSI сохраняет(((

А при открытии файла какие флаги вы использовали для FileOpen?
По дефолту, как в первом посте.


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

Попробовал так

Код:
$path = @ScriptDir & "\ReadUNIcode.txt"
$hFile = FileOpen ($path, $FO_UTF8_NOBOM)
$CountLine = _FileCountLines ($path)
dim $mas[$CountLine]
$mas = FileReadToArray ($hFile)
;_ArrayDisplay ($mas)
FileWrite ( @ScriptDir & "\Test", $mas[1])


все равно ANSI
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
maxd2007 сказал(а):
Так же, в ANSI сохраняет(((

Для FileWrite тоже нужно использовать дескриптор файла открытый в нужной вам кодировке для записи
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Tempo сказал(а):
maxd2007 сказал(а):
Так же, в ANSI сохраняет(((

Для FileWrite тоже нужно использовать дескриптор файла открытый в нужной вам кодировке для записи
Тоже самое, но текст превращается в ANSI уже после функции FileReadToArray.
Делал так
Код:
$path = @ScriptDir & "\ReadUNIcode.txt"
$path2 = @ScriptDir & "\Test2.txt"
$hFile = FileOpen ($path, 256)
$hFile2 = FileOpen ($path2, 256 + 2)
$CountLine = _FileCountLines ($path)
dim $mas[$CountLine]
$mas = FileReadToArray ($hFile)
_ArrayDisplay ($mas)
FileWrite ($hFile2, $mas[1])
 
A

Alofa

Гость
OffTopic:
А что если вместо $FO_UTF8_NOBOM использовать $FO_UTF8 или даже $FO_FULLFILE_DETECT при открытии файла?
(проверить не могу)


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

Это лишнее
Код:
; ...
$CountLine = _FileCountLines ($path)
dim $mas[$CountLine]
; ...
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Alofa сказал(а):
OffTopic:
А что если вместо $FO_UTF8_NOBOM использовать $FO_UTF8 или даже $FO_FULLFILE_DETECT при открытии файла?
(проверить не могу)
$FO_UTF8 - так в UTF-8 сохраняет, FO_UTF8_NOBOM - так в ANSI, $FO_FULLFILE_DETECT - так в ANSI. Естественно менял в обоих FileOpen. То что лишнее в будущем мне понадобится =) просто забыл вырезать из примера))))
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
maxd2007 сказал(а):
$FO_UTF8 - так в UTF-8 сохраняет, FO_UTF8_NOBOM - так в ANSI, $FO_FULLFILE_DETECT - так в ANSI. Естественно менял в обоих FileOpen. То что лишнее в будущем мне понадобится =) просто забыл вырезать из примера))))

А чем вы проверяете кодировку сохраненного файла?
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Tempo сказал(а):
maxd2007 сказал(а):
$FO_UTF8 - так в UTF-8 сохраняет, FO_UTF8_NOBOM - так в ANSI, $FO_FULLFILE_DETECT - так в ANSI. Естественно менял в обоих FileOpen. То что лишнее в будущем мне понадобится =) просто забыл вырезать из примера))))

А чем вы проверяете кодировку сохраненного файла?
Смотрю в хексе и в блокноте виндовом можно посмотреть кодировку (фаил>сохранить как и по умолчанию внизу будет та кодировка которая щас выставлена) которая щас используется в фаиле. Проверяю обоими методами.


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

Мне по сути нужна программа которая будет парсить прошивку и находить расширения используемых фаилов (zip, kmz итд) и переименовывать их (т.к иногда приборы входят в постоянный перезагруз и не определяются компом пока я не удалю эти фаилы, а удалить их я смогу если прибор их не будет читать, т.е преименую скажем zip в zi1 итд), а т.к. прошивки переодически меняются то мне нужен внешний фаил из которого будут считываться расширения. Все расширения в прошивке хранятся в юникоде поэтому мне нужно передать в массив все расширения из текстового фаила для дальнейшего поиска их и просто их все переименовать заменяя последнюю букву на "1".
 
A

Alofa

Гость
ma:rofl:2007
OffTopic:

Данное обсуждение давно уже вышло за рамки темы.
Совет: создайте новую тему и приложите .txt файл.
 
Верх