Files

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Tag.


    Ich wollte eine Kasse für die Fraktionen machen. nun soll der stand der kasse in einer datei gespeichert und wiedergegeben werden.
    die datei wird erstellt, doch nichts wird in dieser datei reingeschrieben.
    hier mein scriptausschnitt:


    new gskasse = 2000000,
    Inhalt[10];


    public OnGameModeInit()
    {
    new File:frakkasse1 = fopen("gskasse.txt",io_readwrite); // Nummer.txt wird geöffnet. Wen sie nicht existiert wird sie erstellt und dan geöffnet.
    fread(frakkasse1,Inhalt); // Inhalt von Nummer.txt wird an variable Inhalt übergeben.
    gskasse = strval(Inhalt); // String Inhalt wird in ein Integer umgewandelt und Handynumemr übergeben.
    fclose(frakkasse1);
    return 1;
    }


    public OnDialogResponse(...)
    {
    if(dialogid == DIALOG_FRAKKA)
    {
    if(response)
    {
    if(listitem == 0)
    {
    new str[256];
    format(str,sizeof(str),"Kasse: %d", gskasse);
    ShowPlayerDialog(playerid,DIALOG_FRAKKA_ÜBERSICHT,DIALOG_STYLE_MSGBOX,"Übersicht",str,"Okay","Zurück");
    }
    }
    }
    if(dialogid == DIALOG_FRAKKA_ÜBERSICHT)
    {
    ShowPlayerDialog(playerid,DIALOG_FRAKKA,DIALOG_STYLE_LIST,"Grove Street Family","Übersicht","Okay","Abbrechen");
    }
    return 1;
    }


    wäre sehr nett wenn mir da einer helfen könnte, das ist das 1. mal das ich so ne datei erstelle..

  • dazu müsste ich ja abfragen ob es schon ein file gibt, denn gskasse = 2000000 und wenn ich das dann unter OnGameModeInit reinschreibe, wird die kasse ja bei jedem restart auf 2000000 gesetzt. die kasse soll von anfang an auf 2000000 sein und dann immer das aktuelle in der datei speichern und sobald der server gestartet wird soll es wieder ausgelesen werden und gskasse soll den ausgelesenen wert bekommen.

  • Dann machst ne if Abfrage ob's die Zeile gskasse schon gibt und nur falls nicht schreibst sie nochmal rein unter OnGameModeInit.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • soeine abfrage würde ich gerne wissen, denn ich kenne mich da überhaupt net aus. ich werde die nächste zeit öfter mit files arbeiten müssen, vllt könnte mir da einer etwas mehr erklären oder mir einen link zu einem tutorial schicken.


    //edit: habe es mal probiert und folgendes gemacht:


    new File:frakkasse1 = fopen("gskasse.txt",io_readwrite);
    new str[1],str2[10];
    format(str,sizeof(str),"");
    format(str2,sizeof(str2),"%d", gskasse);
    if(fread(frakkasse1,Inhalt) == strval(str))
    {
    fwrite(frakkasse1,strval(str2)); //error
    }
    fread(frakkasse1,Inhalt);
    gskasse = strval(Inhalt);
    fclose(frakkasse1);


    das kam dabei raus:


    C:\Users\Simon Siggelkow\Desktop\Server 3b\gamemodes\RL.pwn(651) : error 035: argument type mismatch (argument 2)
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    1 Error.

    Einmal editiert, zuletzt von Simon ()

  • Ich arbeite gar nicht mit Filesystemen von daher bin ich mir nicht sicher ob ich Dir eine große Hilfe sein kann.


    Zunächst mal zum Fehler: strval(..) konvertiert einen String zu einem Integer, fwrite allerdings erwartet einen String und keinen Integer - daher der Fehler.


    Ich versteh nicht ganz was str[1] soll.


    fread liest meines Wissens nach Zeile für Zeile, also machst du folgendes:


    Du schleifst durch Die Zeilen und vergleichst ob
    gskasse=2000000
    schon drinsteht (strcmp und warsch. musst auch den String "gskasse" für den Vergleich vom Rest trennen [strtok, sscanf]).


    Falls ja, machst nichts weiter, falls nein schreibst gskasse=200000 rein.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • Da das Wiki nichts drüber ausspuckt behaupte ich mal dass es ohne Probleme funktioniert.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • Oder du machst es schlau und testest es mit 4 Zeilen Code :thumbup:.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • ich verstehe das mit dem files alles iwie net :D:D bin wohl zu blöd dafür :D


    vllt könnte mir das ja mal einer machen oder mir ein bsp zeigen, so lerne ich am besten.


    wieso sollte ich abfragen ob gskasse = 2000000 in dem file steht


    die datei soll einfach nur die fraktionskasse speichern und wiedergeben.


    das problem dabei ist der anfang, man muss ja zu anfang irgentwie die gskasse definieren. deswegen habe ich sie auf 2000000 getan ($2Millionen).
    nun soll sobald der gamemode gestartet wurde überprüft werden ob gskasse schon drinne steht, wenn nicht soll der aktuelle wert von gskasse, also 2 Millionen, in die datei geschrieben werden. wenn nicht, soll aus der datei gelesen werden und gskasse soll dann diesen ausgelesenen wert übernehmen.


    sobald nun der leader der fraktion z.B. 10k aus der kasse herausnimmt, werdern von der gskasse 10k abgezogen und dann soll der aktuelle wert von gskasse in die datei geschrieben werden.


    da man ein script immer wieder etwas verbessern kann, wird es auch wenn der sevrer richtig online ist einige updates geben. dazu muss man den gamemode stoppen und sobald man ihn startet werden alle fraktionskassen wieder auf 2 Millionen gesetzt. das soll ja eben nicht so sein, die frakkasse soll ja trotz gm restart gleich bleiben.


    ich hoffe ihr versteht wie und warum ich das gerne so möchte und es wäre sehr nett wenn mir das einer machen könnte, ein beispiel würde auch reichen.


    mfg
    Simon

  • Kann sein, dass ich Dich da falsch verstanden hab.
    Wenn Du die Fraktionskasse abspeicher willst, dann prüfst Du halt ob der Eintrag bereits besteht - wie auch immer der aussehen mag. Meins war nur ein Beispiel. Allerdings schreibst Du wieder im darauffolgenden Text, was mein Beispiel eigentlich abdeckt.


    Deswegen die Frage direkt: Wie speicherst Du den Wert der Fraktionskasse denn in deiner File ab bzw wie möchtest Du es abspeichern?

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • ich möchte den wert von der gskasse als integer also als ganze zahl in einer datei abspeichern und sie beim gamemode start auslesen.
    wenn er beim gamemode start nichts ausliest, soll der aktuelle wert von gskasse (wäre dann 2000000) hineingeschrieben werden.


    ich habs bisher so:


    new File:Grovekasse = fopen("frakkasse.txt",io_readwrite);
    fread(Grovekasse,Inhalt);
    if(strcmp(Inhalt, "", true) == 0)
    {
    new string[15];
    format(string,15,"%d",gskasse);
    fwrite(Grovekasse,string);
    }
    gskasse = strval(Inhalt);
    fclose(Grovekasse);


    wäre das denn nun richtig so oder ist da irgentwas falsch dran?

    Einmal editiert, zuletzt von Simon ()

  • Bin mir da nicht 100% sicher da ich das Verhalten von fread nicht kenne bzw. was es zurück gibt wenn nichts gelesen wird. Ich gehe mal von NULL aus, von daher



    new File:Grovekasse = fopen("frakkasse.txt",io_readwrite);
    fread(Grovekasse,Inhalt);
    if(!Inhalt[0])
    {
    new string[15];
    format(string,15,"%d",gskasse);
    fwrite(Grovekasse,string); // string muss gleich dem startwert sein
    gskasse = 200000; // oder was auch immer dein startwert ist
    }
    else
    {
    gskasse = strval(Inhalt);
    }
    fclose(Grovekasse);


    Aber bevor Du fragst ob es klappt, teste es doch einfach selbst aus. Wenn deine stringcmp Methode funktioniert, dann verwende diese ansonsten probier halt mal meine.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • klappt nicht wirklich also meine.


    bei deiner verstehe ich nicht warum du ein "!" vor Inhalt machst.
    und warum gskasse = 2000000 erst nach dem es in die datei geschrieben wird, man muss es doch vorher auf 2000000 setzten und dann in die datei rein schreiben lassen..

  • gskasse verwendest du doch im Skript sobald du den Wert eingelesen hast oder? Wenn der Wert nicht existiert musst ihn ja trotzdem setzen und dann isses sinnvoller das manuell zu machen als in die Datei reinzuschreiben und dann wieder aus der Datei das was Du eben reingeschrieben hast auszulesen. Das was du in die Datei schreibst kannst Du auch direkt als Wert für gskasse setzen.


    !Inhalt[0] == Inhalt[0]=='\0' <- bedeutet dass in den String "NULL" geschrieben wurde. Wie gesagt ich weiß nicht was fread zurückgibt wenn keine Zeile existiert, NULL ist meine Vermutung.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • ich habe oben im script new gskasse.


    dann fragste ab ob etwas in der datei steht wenn nichts steht wird der aktuelle wert von gskasse reingeschreiben und DANN setzt du gskasse uaf 2000000, das muss anders herum aber ich werde es mal eben probieren


    //edit: habs nun so:


    new Inhalt[10], File:Grovekasse = fopen("frakkasse.txt",io_readwrite);
    fread(Grovekasse,Inhalt);
    if(!Inhalt[0])
    {
    gskasse = 2000000; // oder was auch immer dein startwert ist
    new string[15];
    format(string,15,"%d",gskasse);
    fwrite(Grovekasse,string); // string muss gleich dem startwert sein
    }
    else
    {
    gskasse = strval(Inhalt);
    }
    fclose(Grovekasse);


    und sobald ich server starte und datei net vorhanden wird sie gemacht und es steht 2000000 wie gewollt in der datei.
    änder ich nun den wert auf 1500000 und starte gm neu, ändert sich die zahl nicht wie gewohlt.


    klappt also :) nun habe ich da noch ne frage, nun steht da stumpf die zahl in der datei, die ich iwan wieder auslesen will. kann man mehreres nun in dieser datei schreiben? oder kann man das wie bei dini so gestalten:


    Kasse=2000000
    Drogen= 100
    Mats= 100


    und sobald man dann ausließt soll man die einzelnen sachen wie kasse, drogen und mats auslesen können.


    bisher sieht es so in der datei aus:


    2000000

    Einmal editiert, zuletzt von Simon ()

  • Hast recht, musst ändern.


    Klar kannste das so machen, dann schreibst halt anstelle 200000 genau das rein was du weiter unten hinzufügt hast. Wenn du Dini verwendest hälst Dich halt strikt an die Documentation darüber und dann wird das schon klappen.


    Ich würde Dir aber auch raten dann nur Dini Befehle zu verwenden und nicht mal manuell schreiben und mal Dini - sonst kommst schnell durchaneinander. Viel Glück!

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen