Dateifunktionen
Aus SA-MP Wiki
Inhaltsverzeichnis |
File Functions in PAWN
Es scheint für viele sehr schwer zu sein mit den Dateifunktionen richtig umzugehen, auch wenn dies nicht stimmt. Dieses Tutorial wurde von dem user Flame^ im englischsprachigen Wiki erstellt, um die Dateifunktionen zu erklären wie sie ein funktionierendes Script mit Dateioperationen schreiben, ohne dass z.B. Dini benötigt wird (ncihtsdestotrotz ist Dini eine gutes Script :) )
Die Dateifunktionen: Wie man am besten anfängt
Als erstes zeige ich euch ein wenig Code, später werde ich erklären was dahinter steckt undw erde es verbessern.
public OnPlayerConnect(playerid) { new pname[24], File:ftw=fopen("names.txt", io_write); GetPlayerName(playerid, pname, 24); fwrite(ftw, pname); fclose(ftw); }
Dieser Codeschnipsel wird den Spielername des Spielers, der gerade eben den Server betreten hat, in die datei 'names.txt' im scriptfiles Ordner erstellen.Das ist nicht der beste Code, weil wenn wir es so liesen würde der Inhalt der Datei irgendwann so aussehen:
Name1name2name3
Besser wäre allerdings:
Name1 Name2 usw..
Um das zu erreichen müssen wir den Text mit so genannten Escape Codes formatieren:
new string[30]; format(string, 30, "%s\r\n", pname); // formatieren des Strings mit Escape Codes fwrite(ftw, string);
Erklärung: \n erstellt erzwingt einen zeilenumbruch, \r stellt sicher, dass am Anfang der Zeile weiter geschrieben wird. Das Prinzip ist vergleichbar mit dem Druck der Enter-Taste in einer Textverarbeitung.
Wir verwenden den Dateimodus 'schreiben' (io_write). Das Problem dabei ist allerdings, dass es alles überschreibt was früher einmal geschrieben in diese Datei wurde, was wir aber nicht wollen. Es gibt 4 Dateimodi, die wir zum lesen und schreiben nutzen können:
| Description | |
|---|---|
| io_write | Writes in a file, clears all earlier written text |
| io_read | Reads the file, the file must exist, otherwise a crash will occur |
| io_append | Appending to a file, writing only |
| io_readwrite | Reads the file or makes a new one |
Anstelle von io_write nehmen wir als besser den Dateimodi io_append, um zu bereits vorhandenen Text etwas hinzuzufügen:
new pname[24], File:ftw=fopen("names.txt", io_write);
ändern in:
new pname[24], File:ftw=fopen("names.txt", io_append);
So, jetzt habt ihr ein kleines Script, das die Namen aller Spieler die auf euren Server kommen in einer Datei speichert, gut gemacht :-) !
Speichern der Koordinaten eines Spielers im AddPlayerClass format
Jetzt erstellen wir ein Script ähnlich wie das debug-Tool, welches beim SAMP Client dabei ist. Ziel ist es, das unser Script eine AddPlayerClass-Zeile erstellt, die in der Datei 'positions.txt' geschrieben wird.
Als erstes erstellen wir ein paar Variablen inenrhalb des OnPlayerCommandText Callbacks:
new string[256]; new Float:X, Float:Z, Float:Y, Float:Rotation; // Floats to save the pos in
Dann schreiben wir unseren Befehl:
if(strcmp(cmdtext, "/save", true)==0) {
Als nächstes brauchen wir die Koordinaten des Spielers und die Blickrichtung. GetPlayerPos und GetPlayerAngle sind genau dafür gedacht:
if (strcmp(cmdtext, "/save", true)==0) { GetPlayerPos(playerid, X, Y, Z); GetPlayerFacingAngle(playerid,Rotation); } return 1; }
Zuletzt formatieren wir unseren String. Das ist der Code, den wir bisher haben:
new string[256]; new Float:X, Float:Z, Float:Y, Float:Rotation; // Floats to save the pos in if (strcmp(cmdtext, "/save", true)==0) { GetPlayerPos(playerid, X, Y, Z); GetPlayerFacingAngle(playerid, Rotation); new File:pos=fopen("positions.txt", io_append); format(string, 256, "AddPlayerClass(0, %f, %f, %f, %f, 0,0,0,0,0,0);", X, Y, Z,Rotation); fwrite(pos, string); fclose(pos); return 1; }
Ist nicht allzu schwer, oder? Jetzt werden wir das Lesen der Dateien besprechen ;-)
Lesen von Dateien
Du weist jetzt wie man Dateien schreibt, als nächstes lesen wir Dateien. Das kann z.B. nützlich sein für Admin Scripts. Ein Script das über Dateien Konfiguriert wird ist wesentlich leichter zu benutzen, da man nicht ständig im Quellcode graben muss.
Wir schreiben ein Script, das einige Zahlen liest und ausgibt. Als erstes werden wir eine Funktion nutzen, die ich oft verwende um Daten aus Dateien zu lesen:
GetVal(numb, str[]) { new tmp[256], idx; for(new i=0; i<numb; i++) { tmp=strtok(str, idx); } return strval(tmp); }
Du brauchst du Funktion strtok dafür.
Jetzt schreiben wir unsere Funktion, ReadConf(). Um Daten von einer Datei zu lesen, brauchen wir den Dateimodus io_read und die fread Funktion. fread gibt immer nur eine Zeile aus, wenn wir es nur einmal benutzen wird als nur die erste Zeile ausgegeben. Wenn man mehr lesen möchte, braucht man eine for oder eine while-Schleife, hier verwenden wir while.
ReadConf() { new File:cfg=fopen("conf.cfg", io_read); new string[256]; while(fread(cfg, string)) { if(strcmp(string, "mynumb ", true, 7)==0) { MyVal=GetVal(2, string); } } }
Das ist unsere kleine Funktion. new MyVal; muss oben im Script definiert werden! Der Code liest Zeile für Zeile aus der Datei und vergleicht diese mit dem Wort 'mynumb'. Wenn diese Bedingung wahr ist (also wenn die zeile gefunden wurde), wird das Script den Wert MyVal mit dem Wert aus der Datei setzen.
Main() { ReadConf(); printf("%d", MyVal); }
Das wird den Wert von MyVal in der Console ausgeben :-) !
