Что нового

Как зациклить чтение строк из файла?

plazma50

Новичок
Сообщения
8
Репутация
0
Всем привет!
Как зациклить чтение строк из файла функции FileReadLine?
Везде примеры
Код:
If @error = -1 Then ExitLoop
т.е. дочитал до конца и все....
Мне нужно считывать адреса сайтов из текстового файла и поочередно их открывать, а когда список закончится то опять считывать начиная с первой строки и так бесконечно.
Если убираю выше означенную строку из кода, то по окончании списка браузер пытается открыть url http:/// :scratch:
Пока решил банальным закрытием файла после чтения последней строки, а потом через Do/Until опять открытием... но как мне кажется это не красиво...
Спасибо за любую подсказку!
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Читайте сразу весь файл в массив и работайте с полученным массивом. Так проще.
Код:
FileReadToArray() ; в онлайн справке этой функции нет - см. справку AutoIt
; или
_FileReadToArray() ; в онлайн справке устаревшее описание - см. справку AutoIt
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
$fo = FileOpen('1.txt')
$line = 1
While 1
	$frl = FileReadLine($fo, $line)
	If @error = -1 Then
		$line = 1
		ContinueLoop
	Else
		$line += 1
	EndIf
	ConsoleWrite($frl & @LF)
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Мой вариант.
Код:
Local $sFile = @ScriptDir & '\test.txt', $hFile, $sLine, $fExit

HotKeySet('{Esc}', '_Exit')
$hFile = FileOpen($sFile)
If $hFile = -1 Then Exit 1
Do
	$sLine = FileReadLine($hFile)
	If @error Then
		FileSetPos($hFile, 0, 0)
		ContinueLoop
	EndIf
	ConsoleWrite($sLine & @LF)
Until $fExit
FileClose($hFile)

Func _Exit()
	$fExit = True
EndFunc   ;==>_Exit
 
Автор
P

plazma50

Новичок
Сообщения
8
Репутация
0
Всем спасибо! :ok: Все варианты рабочие, но остановился на варианте от joiner как содержащем наименьшее количество If и Do, однако свой скрипт дополнил частью
Код:
HotKeySet('{Esc}', '_Exit')
от madmasles чтобы можно было скрипт прервать. От массива InnI отказался т.к. строк в текстовом файле всего-то 20 штук...
 
Автор
P

plazma50

Новичок
Сообщения
8
Репутация
0
:smile: решил не создавать новой темы, но задачу усложнить.

Возможно-ли чтение строк с разными промежутками времени, например после чтения первой строки подождать 1 мин, а после чтения 2 строки - 3 мин, а после 3 строки - 6 минут и т.д. в разнобой?

Пока сделал так (часть кода)
Код:
......
$frl = FileReadLine($fo, $line)
    If @error = -1 Then
        $line = 1
        ContinueLoop
    Else
        $line += 1
    EndIf
    _FFOpenURL($frl)
		_FFLoadWait()
	Sleep(2000)
.......

но это вариант с одинаковой задеркой в 2 сек, после загрузки строки с url сайта из файла
Спасибо!
 

CrazyDoc

Новичок
Сообщения
75
Репутация
2
plazma50 сказал(а):
но это вариант с одинаковой задеркой в 2 сек, после загрузки строки с url сайта из файла
Спасибо!
возможно
Код:
Sleep(Random ( [ Min = 0 [, Max = 1 [, Flag = 0 ]]] ))
?
 
Автор
P

plazma50

Новичок
Сообщения
8
Репутация
0
Спасибо CrazyDoc , но я наверно ввел вас в заблуждение. Мне нужно не случайное время ожидания между чтением строк, а строго определенное и величину этих таймаутов я должен иметь возможность задавать сам.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Создайте массив задержек
Код:
$aline[0] = 2000
$aline[1] = 4000
$aline[2] = 6000
; И подставляйте вместо Sleep(2000)
Sleep($aline[$line-1])

Главное чтобы строк в массиве было столько же сколько и в файле. Либо проверки какие-то надо делать, скажем если число $line привысило Ubound($aline), то задержка такая-то.
 
Автор
P

plazma50

Новичок
Сообщения
8
Репутация
0
Спрасибо edyapd! Все вроде логично, но вставил в простой код
Код:
#Include <FF.au3>
#include <Array.au3>
_FFStart()
$fo = FileOpen('spisok.txt')
$line = 1

$aline[0] = 2000
$aline[1] = 4000
$aline[2] = 6000

While 1
    $frl = FileReadLine($fo, $line)
    If @error = -1 Then
        $line = 1
        ContinueLoop
    Else
        $line += 1
    EndIf
    _FFOpenURL($frl)
		_FFLoadWait()
		
Sleep($aline[$line-1])

WEnd

и выкидывает ошибку :( наверно руки кривые, Expected a "=" operator in assignment statement жалуется на $aline[0]
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
plazma50
А потому, что массив сперва нужно объявить
Код:
Global $aline[100]
$aline[0] = 2000
...


От массива InnI отказался
Очень даже зря. Смотрите, как упрощается код
Код:
#Include <FF.au3>

Global $aTime[] = [2000, 4000, 6000]

_FFStart()
While 1
  $aLines = FileReadToArray('spisok.txt')
  For $i = 0 To UBound($aLines) - 1
    _FFOpenURL($aLines[$i])
    _FFLoadWait()
    If $i < UBound($aTime) Then Sleep($aTime[$i])
  Next
WEnd
 
Автор
P

plazma50

Новичок
Сообщения
8
Репутация
0
:-[ Вынужден признать InnI что ваш вариант работает идеально. Да простит меня joiner, но ваш ответ в свете вновь открывшихся обстоятельств - лучший. Спасибо за помощь!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
InnI,
А зачем постоянно перечитывать файл в массив?
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Я бы ещё добавил
Код:
else Sleep(2000)  ; Тут задержка по умолчанию, если не прописана в массиве
 
Верх