Что нового

Недокументированная особенность функции _FileReadToArray

Suppir

Продвинутый
Сообщения
967
Репутация
62
Данная функция забирает строки из файла в массив.
Однако, если в файле строки заканчиваются пробелами:

какой-нибудь текст (конец строки)

то эти пробелы вырезаются:
какой-нибудь текст(конец строки)



Таким образом, данные в массиве не соответствуют данным в файле.


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

Если это фича, то она вредоносная и недокументированная. Я два часа бился над скриптом, пока не понял, что функция режет строки :mad: Желающие вырезать конечные пробелы вполне могут это сделать в массиве.
 

kaster

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

у меня все норм с пробелами
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Найдена ошибка в функции _FileReadToArray

я 10 раз проверил:
Если файл (кодирока ANSI) содержит строки, в которых перед концом строки стоят пробел(ы), то пробел(ы) не заносятся в массив.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Re: Найдена ошибка в функции _FileReadToArray

Вот код _FileReadToArray(). Здесь даже написано, что пробелы удаляются. Если такое поведение функции не устраивает, то это легко поправить, просто закомментируй строку, отвечающую за удаление пробелов.

Код:
Func _FileReadToArray($sFilePath, ByRef $aArray)
	Local $hFile, $aFile
	$hFile = FileOpen($sFilePath, 0)
	If $hFile = -1 Then Return SetError(1, 0, 0);; unable to open the file
	;; Read the file and remove any trailing white spaces
	$aFile = FileRead($hFile, FileGetSize($sFilePath))
	; $aFile = StringStripWS($aFile, 2)
	FileClose($hFile)
	If StringInStr($aFile, @LF) Then
		$aArray = StringSplit(StringStripCR($aFile), @LF)
	ElseIf StringInStr($aFile, @CR) Then ;; @LF does not exist so split on the @CR
		$aArray = StringSplit($aFile, @CR)
	Else ;; unable to split the file
		If StringLen($aFile) Then
			Dim $aArray[2] = [1, $aFile]
		Else
			Return SetError(2, 0, 0)
		EndIf
	EndIf
	Return 1
EndFunc   ;==>_FileReadToArray
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Найдена ошибка в функции _FileReadToArray

В официальной документации по AutoIt насчет этой существенной особенности ничего не сказано. Имхо, стоило упомянуть.
 

kaster

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

Вот файл


Вот скрипт
Код:
#include <Array.au3>
#include <File.au3>
Dim $a
_FileReadToArray(@ScriptDir & '\file.txt', $a)
_ArrayDisplay($a)


Вот результат
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Мистика 8)


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

Просто у тебя не срабатывает StringStrip, вот и все :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Kaster [?]
самое интересное что у меня пробелы не удаляются
Пробелы удаляются только в конце файла, а не на каждой строке, т.к StringStripWS применяется на $aFile (кстати почему $a, а не $s? :-\ ), которая содержит весь файл (всё его содержимое).

P.S
И никакая это не особенность, это самая натуральная бага, функция должна возвращать все строки в цельности и сохранности, нечего ей заниматься самодеятельностью (“обрезанием” т.с) :mad:
 

amel27

Продвинутый
Сообщения
146
Репутация
55
вариант на RegExp, для любых разделителей строк CRLF/LF/CR:

Код:
#include <array.au3>

Dim $arr
_FileReadToArray2("C:\TEST\1.txt", $arr)

If @error Then ConsoleWrite("ERR: "& @error &":"& @extended &@CRLF)
_ArrayDisplay($arr)

Func _FileReadToArray2 ($FilePath, ByRef $aArray)
	Local $sFile = @LF&@LF& FileRead($FilePath)
	If @error Then Return SetError(1, 0, False) ; Ошибка чтения файла

	$aArray = StringRegExp($sFile, "(?:\r\n|[\r\n])([^\n\r]*)", 3)
	If Not(IsArray($aArray)) Then  Return SetError(2, 0, False) ; Ошибка разбора

	$aArray[0] = UBound($aArray)-1
	Return True
EndFunc ; ==> _FileReadToArray2()
 
Верх