Что нового

Не происходит запись в блокнот(не знаю, как ещё объяснить)

louie1743shkirondo

Новичок
Сообщения
28
Репутация
0
Итак, решил я такой потренироваться и написать простенькую программку для этого... Но у меня есть одна проблема: скрипт не записывает полученные данные в txt-документ(как бы это банально не звучало...).
Генадий записывает имена, но не вопросы/ответы.. Хотелось бы узнать, почему...
Сам код:
Код:
#include <file.au3>
#include <Array.au3>

HotKeySet("{ESC}", "Close")

$Input = InputBox("Знакомство", "Как тебя зовут?")

If Not FileExists(@ScriptDir & "\Name.txt") Then _FileCreate(@ScriptDir & "\Name.txt") ; Создание txt файла

$FilePathNames = @ScriptDir & "\Name.txt"
$aArray = FileReadToArray($FilePathNames)
   _ArraySearch($aArray, $Input)

If Not @error Then
   Msgbox(0, "Yeah", "Да, я знаю тебя, " & $Input)
Else
   $File = FileOpen($FilePathNames)
   $FileWrite = FileWrite($FilePathNames, $Input & @CRLF)
   FileClose($FilePathNames)
   Msgbox(0, "Noup", "Меня зовут Генадий, будем знакомы")
EndIf

If Not FileExists(@ScriptDir & "\QuestAns.txt") Then _FileCreate(@ScriptDir & "\QuestAns.txt")

Global $qFileRead = FileOpen(@ScriptDir & "\QuestAns.txt")

While 1
   Global $Ask = InputBox("ASK", "Спроси что-нибудь.. Что ли")
   Global $qArray = FileReadToArray($qFileRead)
      _ArraySearch($qArray, $Ask)
   If Not @error Then
	  While 1
		 Global $Line = FileReadLine($qFileRead)
		 Global $Quest = ""
		 GLobal $Ans = ""
		 If @error = -1 Then
			ExitLoop
			$String = StringSplit($Line, "|")
			$Quest = $String[1]
			$Ans = $String[2]
		 EndIf
	  WEnd
   Else
	  $Ups = InputBox("Help", "Я не знаю, как ответить на твой вопрос, введите ответ на него, и я его запомню: ")
	  $FileWrite = FileWrite($qFileRead, $Ask & "|" & $Ups & @CRLF)    ; Вся проблема тут(хотя я могу ошибаться)
   EndIf
WEnd


Func Close()
   FileClose($qFileRead)
   Exit
EndFunc

Если есть какие-либо мысли, прошу помочь и "наставить на путь истинный" (Рад любым предложениям/исправлениям(
даже осуждениям
))
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Посмотрите функцию
Код:
Global $qFileRead = FileOpen(@ScriptDir & "\QuestAns.txt")
и обратите внимание на параметр "mode" функции "FileOpen" - в Вашем случае там должна быть "1", у Вас по умолчанию, то есть "0"- файл открывается только для чтения. Во второй части скрипта, где вопрос-ответ - всё удобнее организовать не через txt файл, а через ini файл, да и имена туда-же можно писать.Так , как у Вас - вы вопрос не сравниваете нигде с шаблоном, соответственно и ответа не получите никогда
Код:
IniWrite()
IniRead()

Вот , например Ваш скрипт. только с ini файлом:
Код:
#include <file.au3>
#include <Array.au3>

HotKeySet("{ESC}", "Close")

$Input = InputBox("Знакомство", "Как тебя зовут?")

$FilePathNames = @ScriptDir & "\Name.ini"
If Not FileExists($FilePathNames) Then _FileCreate($FilePathNames) ; Создание ini файла


If Not IniRead($FilePathNames, 'Name', $Input, 0) Then
	MsgBox(0, "Yeah", "Да, я знаю тебя, " & $Input)
Else
	IniWrite($FilePathNames, 'Name', $Input, ' ');Пишем просто ключ-имя, значения нет
	MsgBox(0, "Noup", "Меня зовут Генадий, будем знакомы")
EndIf

While 1
	Global $Ask = InputBox("ASK", "Спроси что-нибудь.. Что ли")
	$Answer = IniRead($FilePathNames, 'Quest', $Ask, '')
	If $Answer Then
		MsgBox(0, '', $Answer)
	Else
		$Ups = InputBox("Help", "Я не знаю, как ответить на твой вопрос" & @CRLF & $Ask & @CRLF & ", введите ответ на него, и я его запомню: ")
		If Not @error Then IniWrite($FilePathNames, 'Quest', $Ask, $Ups)
	EndIf
WEnd


Func Close()
	Exit
EndFunc   ;==>Close
 
Автор
L

louie1743shkirondo

Новичок
Сообщения
28
Репутация
0
ra4o сказал(а):
Посмотрите функцию
Код:
Global $qFileRead = FileOpen(@ScriptDir & "\QuestAns.txt")
и обратите внимание на параметр "mode" функции "FileOpen" - в Вашем случае там должна быть "1", у Вас по умолчанию, то есть "0"- файл открывается только для чтения. Во второй части скрипта, где вопрос-ответ - всё удобнее организовать не через txt файл, а через ini файл, да и имена туда-же можно писать.Так , как у Вас - вы вопрос не сравниваете нигде с шаблоном, соответственно и ответа не получите никогда
Код:
IniWrite()
IniRead()

Вот , например Ваш скрипт. только с ini файлом:
Код:
#include <file.au3>
#include <Array.au3>

HotKeySet("{ESC}", "Close")

$Input = InputBox("Знакомство", "Как тебя зовут?")

$FilePathNames = @ScriptDir & "\Name.ini"
If Not FileExists($FilePathNames) Then _FileCreate($FilePathNames) ; Создание ini файла


If Not IniRead($FilePathNames, 'Name', $Input, 0) Then
	MsgBox(0, "Yeah", "Да, я знаю тебя, " & $Input)
Else
	IniWrite($FilePathNames, 'Name', $Input, ' ');Пишем просто ключ-имя, значения нет
	MsgBox(0, "Noup", "Меня зовут Генадий, будем знакомы")
EndIf

While 1
	Global $Ask = InputBox("ASK", "Спроси что-нибудь.. Что ли")
	$Answer = IniRead($FilePathNames, 'Quest', $Ask, '')
	If $Answer Then
		MsgBox(0, '', $Answer)
	Else
		$Ups = InputBox("Help", "Я не знаю, как ответить на твой вопрос" & @CRLF & $Ask & @CRLF & ", введите ответ на него, и я его запомню: ")
		If Not @error Then IniWrite($FilePathNames, 'Quest', $Ask, $Ups)
	EndIf
WEnd


Func Close()
	Exit
EndFunc   ;==>Close




Да, спасибо большое, впредь, надо быть внимательнее... А можно поподробнее насчёт ini-файлов, просто я раньше никогда с ними дело не имел и не знаю, в принципе, в чём плюсы их использования...


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

Да, кстати, я последовал вашему совету и поставил mode 1 в FileOpen.
И он даже записывает теперь всё в .txt-файл. Но не читает из него информацию... (Ту, что записал)
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Плюсы использования ini файлов - в удобстве работы с ними посмотрите в справке функции. там ничего сложного
Код:
IniWrite()
IniRead()
IniDelete()
IniReadSection()
IniReadSectionNames()
IniRenameSection()
IniWriteSection()

Но не читает из него информацию...
Почему-же не читает ? Читает, только посмотрите внимательно на тот участок кода, где он это делает:
Код:
While 1
         Global $Line = FileReadLine($qFileRead);Читаем очередную строку файла , начиная с первой
         Global $Quest = "";Вопрос- пусто
         GLobal $Ans = "";Ответ-пусто
         If @error = -1 Then;Если прочитанная строка  последняя
            ExitLoop ;Выход из цикла			
            $String = StringSplit($Line, "|");Эта строка никогда выполняться не будет, ведь мы уже вышли из цикла 
            $Quest = $String[1];И эта тоже 
            $Ans = $String[2];и эта
			;и даже если выход из цикла поместить сюда , то что будет в переменных ?
			;В переменных будет содержание последней строки прочитанного файла !
         EndIf
      WEnd
Если уж Вам всё-таки хочется работать именно с текстовым файлом , тогда уж в цикле, после чтения очередной строки - разбиваете её на части вопрос/ответ , сравниваете вопрос с тем, что задали и при совпадении - выводите ответ и выход из цикла, например так :
Код:
While 1
	Global $Line = FileReadLine($qFileRead);Читаем очередную строку файла , начиная с первой
	If @error = -1 Then;Если прочитаны все строки и вопрос так и не найден- запрашиваем ответ
		$Ups = InputBox("Help", "Я не знаю, как ответить на твой вопрос, введите ответ на него, и я его запомню: ")
		$FileWrite = FileWrite($qFileRead, $Ask & "|" & $Ups & @CRLF)
		ExitLoop ;Выход из цикла
	EndIf
	;Если  всё-же не все строки прочитаны
	$String = StringSplit($Line, "|");разбиваем строку по "|"
	If Not @error ;Если без ошибки разбили строку
		If $Ask = $String[1] Then ;Если вопрос в текущей строке совпадает с заданным вопросом
			$Ans = $String[2];Берём ответ из второй части этой строки и
			ExitLoop ;выходим из цикла
		EndIf
	EndIf
WEnd

Да , там Вы ещё файл в массив прочитали, но с массивом так и не работаете, быстрее в разы, конечно не читать файл построчно, а перебирать массив строк, но это уже, я думаю сами измените 2 строки в цикле
 
Автор
L

louie1743shkirondo

Новичок
Сообщения
28
Репутация
0
ra4o сказал(а):
Плюсы использования ini файлов - в удобстве работы с ними посмотрите в справке функции. там ничего сложного
Код:
IniWrite()
IniRead()
IniDelete()
IniReadSection()
IniReadSectionNames()
IniRenameSection()
IniWriteSection()

Но не читает из него информацию...
Почему-же не читает ? Читает, только посмотрите внимательно на тот участок кода, где он это делает:
Код:
While 1
         Global $Line = FileReadLine($qFileRead);Читаем очередную строку файла , начиная с первой
         Global $Quest = "";Вопрос- пусто
         GLobal $Ans = "";Ответ-пусто
         If @error = -1 Then;Если прочитанная строка  последняя
            ExitLoop ;Выход из цикла			
            $String = StringSplit($Line, "|");Эта строка никогда выполняться не будет, ведь мы уже вышли из цикла 
            $Quest = $String[1];И эта тоже 
            $Ans = $String[2];и эта
			;и даже если выход из цикла поместить сюда , то что будет в переменных ?
			;В переменных будет содержание последней строки прочитанного файла !
         EndIf
      WEnd
Если уж Вам всё-таки хочется работать именно с текстовым файлом , тогда уж в цикле, после чтения очередной строки - разбиваете её на части вопрос/ответ , сравниваете вопрос с тем, что задали и при совпадении - выводите ответ и выход из цикла, например так :
Код:
While 1
	Global $Line = FileReadLine($qFileRead);Читаем очередную строку файла , начиная с первой
	If @error = -1 Then;Если прочитаны все строки и вопрос так и не найден- запрашиваем ответ
		$Ups = InputBox("Help", "Я не знаю, как ответить на твой вопрос, введите ответ на него, и я его запомню: ")
		$FileWrite = FileWrite($qFileRead, $Ask & "|" & $Ups & @CRLF)
		ExitLoop ;Выход из цикла
	EndIf
	;Если  всё-же не все строки прочитаны
	$String = StringSplit($Line, "|");разбиваем строку по "|"
	If Not @error ;Если без ошибки разбили строку
		If $Ask = $String[1] Then ;Если вопрос в текущей строке совпадает с заданным вопросом
			$Ans = $String[2];Берём ответ из второй части этой строки и
			ExitLoop ;выходим из цикла
		EndIf
	EndIf
WEnd

Да , там Вы ещё файл в массив прочитали, но с массивом так и не работаете, быстрее в разы, конечно не читать файл построчно, а перебирать массив строк, но это уже, я думаю сами измените 2 строки в цикле

Большое спасибо за ваш ответ, я правда очень благодарен вам ;D
 
Верх