Daten aus Textdatei auslesen

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Daten aus Textdatei auslesen

    Hallo,

    wie bekomme ich es hin, bestimmte Zahlen aus einer Textdatei (.txt) auszulesen. In der Textdatei steht in jeder Zeile ein Wort und dahinter eine Zahl. Die beiden sind durch das Zeichen "|" abgetrennt. Beispiel: Apfel|100. Wenn man jetzt mit der Aktion get_string Apfel eingibt, soll der Wert 100 in einer Varibalen gespeichert werden. Habt ihr Lösungen oder Lösungsansätze?

    Schonmal Danke :DD
    I am a in the GM Quiz!
  • Ich verstehe den Code nicht ganz und kann ihn nicht einsetzen. Am besten gebe ich euch mal den Code, mit dem ich es versucht hab.

    Left Button Pressed:

    GML-Quellcode

    1. datei=file_text_open_read("Kalorientabelle.txt");
    2. text=file_text_read_string(datei);
    3. anzahl=0;
    4. nahrungsmittel=get_string("Geben Sie hier den Namen des Nahrungsmittels ein, das sie gegessen haben","");
    5. menge[anzahl]=get_string("Geben Sie nun ein, wieviel Sie gegessen haben (in g)","");
    6. kalorien=(string_copy(text,nahrungsmittel+string("|"),4) * (menge / 100));
    7. global.kalorien+=kalorien;
    8. kalorien=0;
    9. file_text_close(datei);
    Alles anzeigen


    Mit einem Linksklick auf das Objekt, wird zuerst das Nahrungsmittel und dann die Menge davon abgefragt. Danach soll das Programm die Kalorien, die man gegessen hat berechnen.

    Schonmal Danke für die Hilfe. :DDD
    I am a in the GM Quiz!
  • Ohh! Okey, jetzt verstehen wir es. Dein Problem ist garnicht so einfach. Zum einen benzt du aber string_copy falsch. Das zweite aArgument (also der start-Index) muss eine zahl sein!
    Du musst die Funktion string_pos(substring,string) verwenden.
    Der code müsste in etwa so aussehen:

    GML-Quellcode

    1. datei=file_text_open_read("Kalorientabelle.txt");
    2. text=file_text_read_string(datei);
    3. anzahl=0;
    4. nahrungsmittel=get_string("Geben Sie hier den Namen des Nahrungsmittels ein, das sie gegessen haben","");
    5. menge[anzahl]=get_string("Geben Sie nun ein, wieviel Sie gegessen haben (in g)","");
    6. kalorien=(string_copy(text,string_pos(nahrungsmittel+"|",text) + string_length(nahrungsmittel+"|"), 4) * (menge / 100));
    7. global.kalorien+=kalorien;
    8. kalorien=0;
    9. file_text_close(datei);
    Alles anzeigen

    Code ist ungetestet. Hoffe aber dass es dich auf alle Fälle in die richtige Richtung weist.

    string_pos findet die erste Stelle im Text wo das erste Argument vorkommt. Somit muss du in string_copy diese Funktion verwenden und genau den Teil zu kopieren der dahinter ist.
    Bedenke dass diese Methode ziemlich zerbrechlich ist. Deiner Textdatei muss aus eienr einzigen Zeile bestehen (da die read_string Funktion immer nur eine Zeile ausliest - mit file_text_readln springt man zur nächsten Zeile!) und es dürfen auf keine Leerzeichen irgendwo auftauchen wenn sie nicht auch im code berücksichtigt werden...

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DragonGamer ()

  • Danke für die Antwort. Ich bekomme allerdings jetzt eine Fehlermeldung, die aber eigentlich nichts mit deinem Code zú tun hat.


    ___________________________________________
    ERROR in
    action number 1
    of Mouse Event for Left Pressed
    for object nahrungsmittel_button_object:

    Error in code at line 9:
    kalorien=(string_copy(text,string_pos(nahrungsmittel+"|",text) + string_length(nahrungsmittel+"|"), 4) * (menge / 100));
    ^
    at position 117: Wrong type of arguments to /.


    Das bedeutet doch, dass der Computer das Zeichen "/" iwie falsch versteht, oder ??
    I am a in the GM Quiz!
  • Oh. Gm's Fehlermeldungen sind nicht immer sehr leicht zu verstehen. In diesem Fall bedeuutet dass einfach dass du einen string zu teilen versuchst (wrong type = falscher (Daten-)typ) was nicht geht.
    get_string gibt ja immer strings zurück, auch wenn der Spieler wirklich eine Zahl eingegeben hat.
    Schreib einfach statt "menge" real(menge) in die Klammer.

    Bedenke jedoch dass wenn der User nun etwas eingibt dass sich nicht in eine Zahl umwandeln lässt, also ein Buchstabe zum Beispiel, wirft die real() Funktion eine Fehlermeldung...

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Jetzt gibt er mir die Fahlermeldung :D :


    ___________________________________________
    ERROR in
    action number 1
    of Mouse Event for Left Pressed
    for object nahrungsmittel_button_object:

    Error in code at line 9:
    kalorien=(string_copy(text,string_pos(nahrungsmittel+"|",text) + string_length(nahrungsmittel+"|"), 4) * (real(menge) / 100));
    ^
    at position 109: Wrong type of arguments to *.
    I am a in the GM Quiz!
  • Was auch hilft ist so eine lange Zeile in mehrere aufzuteilen und einzelne Berechnungen vorher in Variablen zwischenzuspeichern. So bekommst du später auch eine genauere Fehlermeldung.
    Einige meiner Spiele:
  • Hab zwar nicht denn ganzen Code angeguckt, aber du dividierst die variable menge durch 100, da aber jedoch menge ein Array sein sollte müsstest du ja den index angeben oder hab ich mich verguggt?

    MfG Rodrog
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Rodrog schrieb:

    Hab zwar nicht denn ganzen Code angeguckt, aber du dividierst die variable menge durch 100, da aber jedoch menge ein Array sein sollte müsstest du ja den index angeben oder hab ich mich verguggt?

    Da Anzahl allerdings 0 ist und somit auf menge[0] referenziert wird, kann man das [0] einfach weglassen (hat den selben Effekt).
    Zudem wäre es sinnvoll, der menge gleich einen real-wert zuzuweisen, da real() und string() wirklich langsam sind und zudem steigert das die Lesbarkeit des Codes.

    Das könnte dann Beispielsweise so aussehen:
    Spoiler anzeigen

    GML-Quellcode

    1. datei=file_text_open_read("Kalorientabelle.txt");
    2. text=file_text_read_string(datei);
    3. anzahl=0;
    4. nahrungsmittel = get_string("Geben Sie hier den Namen des Nahrungsmittels ein, das sie gegessen haben","");
    5. menge[anzahl] = real(get_string("Geben Sie nun ein, wieviel Sie gegessen haben (in g)","")); // get_integer würde es hier auch tun!
    6. faktor = real(string_copy(text,string_pos(nahrungsmittel+"|",text) + string_length(nahrungsmittel+"|"), 4));
    7. kalorien = (faktor * (menge[anzahl] / 100));
    8. global.kalorien += kalorien;
    9. kalorien = 0;
    10. file_text_close(datei);
    Alles anzeigen


    - Tobi97
  • Tut mir leid, funktioniert immer noch nicht. Ich hab jetzt mal den Code zerteilt, aber es klappt trotzdem nicht.

    GML-Quellcode

    1. datei = file_text_open_read("Kalorientabelle.txt");
    2. text = file_text_read_string(datei);
    3. nahrungsmittel = get_string("Geben Sie hier den Namen des Nahrungsmittels ein, das sie gegessen haben","");
    4. menge = get_string("Geben Sie nun ein, wieviel Sie gegessen haben (in g)","");
    5. stelle = string_copy(text,string_pos(nahrungsmittel+"|",text),3);
    6. kalorien = real(stelle) * (real(menge) / 100);
    7. global.kalorien += kalorien;
    8. kalorien = 0;
    9. file_text_close(datei);
    Alles anzeigen
    I am a in the GM Quiz!
  • Was für ein Fehler kommt denn diesmal?
    Sofern die Formatierung innerhalb der gegebenen Textdatei übereinstimmt, müsste es _eigentlich_ funktionieren...
    Lass dir mal die Variable "stelle" ausgeben und schau ob dort das drin steht was drinstehen sollte.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Ich kann auch sehr gut verstehen warum es nicht funktioniert. Wie soll er denn alle Information aus einer einzigen Zeile lesen? Habe mal ein Script geschrieben, habe es getestet und funktioniert 100%:

    GML-Quellcode

    1. datei = file_text_open_read("Kalorientabelle.txt");
    2. nahrungsmittel=string_lower(get_string("Geben Sie hier den Namen des Nahrungsmittels ein, das sie gegessen haben",""));
    3. kal = 0;
    4. do
    5. {
    6. text = file_text_read_string(datei);
    7. if(nahrungsmittel == string_copy((string_lower(text)),0,string_length(nahrungsmittel)))
    8. {
    9. kal += real(string_digits(text));
    10. break;
    11. }
    12. file_text_readln(datei);
    13. }
    14. until(file_text_eof(datei))
    15. file_text_close(datei);
    16. if(kal == 0)
    17. {
    18. show_message("Nahrungsmittel existiert nicht!")
    19. }
    20. else
    21. {
    22. anzahl = get_integer("Geben Sie nun ein, wieviel Sie gegessen haben (in g)",0)
    23. kal *= anzahl/100;
    24. }
    25. global.kalorien += kal;
    26. kal = 0;
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Chris987 ()

  • Also ich hab mal angenommen dass er beachtet hat was ich geschrieben hatte...
    Deine Textdatei muss aus einer einzigen Zeile bestehen (da die read_string Funktion immer nur eine Zeile ausliest - mit file_text_readln springt man zur nächsten Zeile!)

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)