Aufbauproblem

  • Hallo an alle, Ich habe mich nach sehr langer Zeit mal wieder an einem Script Probiert und hab da einige Probleme mit dem Aufbau.

    Mein Ziel: ich möchte die Coodinaten für die Mauskicks aus einer .ini oder Textdatei lesen lassen.

    Diese ist aktuell so aufgebaut:

    920,530

    bestsätigen

    1089,510

    Weiter

    1089,510

    Zur Eingabe

    Deswegen möchte ich nur jede 2te Zeile gelesen haben(Also nur die mit den Coordinaten) und diese Variablen dann als diese angeben.

    genau da liegt aber mein Problem ich bekomme diese Abfrage nicht hin.

    Ich habe beabsichtigt auf Sachen wie Filegethandle und FF.au3 vesichtet.

    Wie muss ich das besser oder schöner gestalten das mein Vorhaben gelingt?


    Spoiler anzeigen
  • Mein Ziel: ich möchte die Coodinaten für die Mauskicks aus einer .ini oder Textdatei lesen lassen.

    Diese ist aktuell so aufgebaut:
    920,530

    Bestätigen

    [...]
    Deswegen möchte ich nur jede 2te Zeile gelesen haben (also nur die mit den Coordinaten) und diese Variablen dann als diese angeben.

    Hinterlege die Daten in einer Datei, z.B. MouseCoord.txt mit dem Aufbau :

    920;530;Bestätigen

    1089;510;Weiter

    1089;510;Zur Eingabe

    Diese kannst Du dann z.B. mit _FileReadToArray einlesen und Dir den Zeilenversatz sparen.

    Beispiel :

    C
    #include <File.au3>
    #include <Array.au3>
    Global $aMouseCoord, $sFileMouseCoord = @ScriptDir & "\MouseCoord.txt"
    _FileReadToArray($sFileMouseCoord, $aMouseCoord, $FRTA_NOCOUNT, ";")
    If @error Then Exit MsgBox(BitOR(4096, 16), "Fehler : ", "Fehler " & @error & " ist aufgetreten")
    _ArrayDisplay($aMouseCoord)

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Du könntest alternativ (falls der Aufbau bleiben soll) auch jede zweite Zeile abfragen:

    Code
    _FileReadToArray($FilePath, $Array, $FRTA_COUNT, ",")
    For $i = 1 To $Array[0] Step +2
        MsgBox($MB_SYSTEMMODAL, "", "Readed line: " & $i)
    Next

    Wobei ein sauberes Array wie Musashi es aufgezeigt hat schöner ist.

  • Und mal nebenbei:

    Finde ich grausam.

    1. Zeile: $i=-1 = 1 ;macht keinen Sinn. "= 1" ist überflüssig, wenn du bei -1 starten willst

    2. Zeile: $line = FileReadLine($file, $i) ;macht keinen Sinn, da in Zeile 4 redefiniert und dazwischen nicht gebraucht wird.

    3. Zeile: $i=$i+1 Eine Schleifenvariable ;in der Schleife zu verändern kann gefährliche/unvorhersehbare folgen haben.

    5. Zeile: if $line = ("") then Exit ; Willst du hier das Programm beenden oder nur die Schleife (wäre sonst Exitloop)?

    7. Zeile: Global $aCoordinates1[2] = [$line] ; Ich bin generell kein Freund davon Variablen innerhalb einer Funktion zu initialisieren, erst recht nicht global, das gehört aus meiner Sicht an den Start des Scriptes, hier nur die Zuweisung (ohne Global)

    9. Zeile: FileClose($file); Du schließt die Datei obwohl du im nächsten Schleifendurchlauf wieder drauf zugreifen willst, das wird zu Problemen führen. Das Fileclose muss hinter die Schleife

    Und das ist nur ein Teil der mir auf die Schnelle aufgefallen ist.

  • Ergänzend zu Moombas Erläuterungen:

    $i =-1 = 1 wird implizit zu $i = False und durch die implizite Typkonvertierung bleibt am Ende dann nur folgendes übrig: $i = 0

    Also nichts mit ;fängt bei -1 an zu zählen.
    Dir fällt das lediglich nicht auf, weil die erste Zeile bei FileReadLine mit 1 angesprochen wird und nicht mit 0.
    Das erste FileReadLine schmeißt bei dir daher auch einen Fehler den du aber nicht abfragst.

    Wenn man bei FileReadLine den zweiten Parameter benutzt - also die Angabe der Zeilennummer, dann passiert bei jedem einzelnen Aufruf folgendes:

    • Die Datei wird geöffnet. (falls Dateipfad statt Handle übergeben wurde)
    • Der Zeiger wird auf den Dateianfang gesetzt.
    • Die Datei wird Zeichen für Zeichen durchgearbeitet und nach Zeilenumbruchzeichen Ausschau gehalten.
    • Ist die gewünschte Anzahl erreicht wird bis zum nächsten Zeilenumbruch gesucht und alles dazwischen zurückggeben
    • Die Datei wird wieder geschlossen

    Und das jedes einzelne mal!
    Das ist natürlich pures Gift für die Performance wenn man auf die Idee kommt hiermit eine Datei durchzuiterieren.
    Zumal der Effekt fatalerweise exponentiell ansteigt mit der Größe der Datei.
    Um die Datei wirklich zeilenweise durchzugehen - und das auch nur einmal - und dabei jede zweite Zeile zu überspringen wäre folgendes die viiiiiiel bessere Variante

    if $line = ("") - das klappt wirklich nur dann wenn keine Leerzeilen in der Datei stecken.
    Ob das Ende erreicht ist wird stattdessen über @error (wäre dann der Wert -1 - siehe Hilfe) abgefragt.

    AutoIt
    Global $aCoordinates1[2] = [$line] 
    msgbox(0,'ms1','the line ' & $i & ' is ' & $aCoordinates1[0],$aCoordinates1[1])

    Du erstellst ein Array mit 2 Elementen und weist dem ersten Element einen Wert zu.
    Direkt darauf erstellst du eine Messagebox, deren Titel u.A. das erste Element enthält und als Text das zweite.
    Dieses muss allerdings zwangsläufig leer sein, weswegen du da auch stattdessen "" schreiben könntest.

    Da du anscheinend eh die Koordinaten anschließend noch auseinander nehmen willst kann man das ganze auch alles gleich in einem Abwasch erledigen:

    AutoIt
    $sFilePath = @ScriptDir & "\test.txt"
    
    ; Koordinaten aus Datei herausfiltern:
    $aKoordinaten = StringRegExp(FileRead($sFilePath), '(?m)^(\d+),(\d+)$', 4)
    
    ; Koordinatenzeilen einzeln durchgehen:
    For $aCoords In $aKoordinaten
        ConsoleWrite($aCoords[1] & " - " & $aCoords[2] & @CRLF)
    Next
  • BugFix oder Oscar :

    Wäre es nicht ggf. sinnvoll, diesen Thread nach 'Hilfe & Unterstützung zu verschieben ?

    Nicht angepinnte Posts im Testforum werden, soweit ich weiß, nach XX Tagen aus der Übersicht entfernt.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Vielen Dank für Eure hilfen.

    Ich habe noch ein zusätzliches problem:

    Da ich den Prozess nun mehrfach machen muss möchte ich gern, das ganze von forn beginnen lassen um eine neue Textdatei ins Fester ziehen zu können. Wie muss ich welche schleife ansetzen damit dies realisierbar wird?

    gerne kann der Thread in ein Passendes Schema geschoben werden.

  • Du brauchst dafür keine Schleife, sondern einen Funktionsaufruf.

    Lager den Teil, der mehrfach ausgeführt werden muss, in eine "Func" aus und übergebe dieser immer den Dateinamen mit: Func($IniFile)

    Dann brauchst du nur die Funktion immer wieder dort aufrufen wo du es benötigst und den neuen Dateinamen übergeben.

  • Super, Ich danke Euch ganz herzlich.

    hat Funktioniert.

    Auf die Func bin ich garnicht gekommen, ich hab mich so in die Theorie "Schleife" verbissen das ich das außer acht gelassen habe.