-
Sziasztok! Megkérdezném, hogy hogyan tudnám lekérdezni egy fájl sorait? Konkrétan azt szeretném, hogy egy dini fájl minden sorának értékét lekérdezem és ami nem 0 azt kiírni egy dialogba.
-
Gondolom én ere gondolsz :D
-
Nem teljesen. Én azt szeretném, hogy fájlom sorainak értékét olvassa ki.
Pl. van 2 betûm:
a=5
b=6
És akkor azt szeretném, hogy dinibõl kiolvasva ezt a 2 értéket jelenítse meg nekem dialogba. Tehát, hogy a listitem dialog így nézzen ki formailag: 5\\n6.
-
Nem teljesen. Én azt szeretném, hogy fájlom sorainak értékét olvassa ki.
Pl. van 2 betûm:
a=5
b=6
És akkor azt szeretném, hogy dinibõl kiolvasva ezt a 2 értéket jelenítse meg nekem dialogba. Tehát, hogy a listitem dialog így nézzen ki formailag: 5\\n6.
Ja értem, akor én olvastam félre.
Példa:
new
a = 5,
b = 3;
if (a == 5 && b != 3)
{
print(\"Won\'t be printed\");
}
Forrás: Wiki SA-MP
-
De nem így :D . Egy ciklus kéne nekem, ami lefut a fájl minden során és kiírja azok soroknak értékeit. :D Nem tudom ennél jobban elmagyarázni.
-
http://wiki.sa-mp.com/wiki/Fread
Reading Line-by-Line részt nézd meg ebbõl menni fog vagy kell még segítség?
-
És ha valamivel (pl. sscanf) feladarabolnád /n szerint?
//A dinit nem annyira tudom, itt le kell kérned a fájlod teljes tartalmát a karilanc stringbe.
new karlanc[128],szam1,szam2;
sscanf(karlanc, \"d<\\n>d\", szam1, szam2)
//Mostmár azt csinálsz a számaiddal, amit akarsz.
Richard: Én is onnan néztem, ezen az elven csinálta, csak elavultabb megoldással.
-
soronként beolvassa a fájlt és összefûzi az = után levõ szöveget 1 stringbe...ezt kell csinálnia :)
-
Köszönöm a segítséget, nem sikerült megoldanom, de ki kell találnom valami mást. Nem tudom, hogy lehet megoldani egy táska tartalmának lekérdezését :D . Ennyi.
-
ezt próbáld ki:
new string[64],dialog[128],value;
new File:example = fopen(\"taska.txt\", io_read);
if(example)
{
while(fread(example, string))
{
if(sscanf(string,\"p<=>{s[16]}i\",value)) { continue; }
//
if(strlen(dialog))
{ format(dialog,sizeof(dialog),\"%s\\n%d\",dialog,value); }
else
{ format(dialog,sizeof(dialog),\"%d\",value); }
}
fclose(example);
}
-
Valahogy így próbáltam én is. Elmagyarázod, hogy mit jelent ez a sor? Konkrétabban ez érdekel: p<=>{s[16]}i .
if(sscanf(string,\"p<=>{s[16]}i\",value))
-
Ha jól értem, akkor a fájl tartalmát az egyenlõség jelek mentén darabolja fel, a string típusú dolgokat (pl. azt, hogy \"a\") kihagyja, majd az integer típusú dolgokat (amely ugye egy szám lesz, pl. az \"a=3\"-nál a 3) a value változóba rakja. Pl. annál, hogy \"a=3\" az = jelek mentén fogja feldarabolni a dolgot, az a betût nem fogja figyelembe venni, és csak a 3-ast tárolja el. Vagy legalábbis valami ilyesmi, de ha nekem nem sikerült, majd más érthetõbben elmagyarázza.
-
http://forum.sa-mp.com/showthread.php?t=120356
szerintem ezt olvasd végig nagyon sokat tanulhatsz belõle :)
én is innen néztem :) emlékeztem régebbrõl hogy van ilyen lehetõség és utána néztem...
-
Aha, vágom, köszi :D . Most már csak az a baj, hogy rájöttem nekem nem fájlból kell kiolvassa, hanem az enumokat kell leolvassa szépen, amit betölt ebbõl a fájlból bejelentkezéskor. Bocsi srácok! :D Csak annyit kérdeznék, hogy egy enum listát hogyan kell leolvasni? :D :D
-
Fájl sorainak beolvasása egy megadott fájlból, és kiíratása konzol ablakban.
new
File:F = fopen(\"dini.fuck\", io_read),
str[128];
if(F)
{
while(fread(F, str))
{
print(str);
}
fclose(F);
}
Ezt kell úgy módosítani hogy a beolvasott sorokat feldarabolja valamilyen eljárás az = (egyenlõségjel) mentén, majd össze kell fûzzni egy karakterláncba a kapott eredményt amit ki kell íratni dialogba.
Sajnos egy ideje nem szkriptelek és semmi kedvem nincs tesztelgetni de hamar össze dobok valamit.
stock
akarmi(playerid, filename[])
{
new
File:F = fopen(filename, io_read), // Fájl megnyitása
str[128], // karakterlánc tárolása
dialogstring[256], // kimeneti, illetve a végeredmény tárolása
name[64], // Jelenleg nincs rá szükség csak az eljáráshoz kell
value[64]; // érték melyeket majd össze kell fûzni a dialogstring-be ha nem nulla persze karakterláncként beolvasva
if(F) // Fájl megnyitásának ellenõrzése
{
while(fread(F, str)) // Addig olvasunk amíg van sor
{
if(ini_cut(str, name, value)) printf(\"Error. line: %s\", str); // Adat ellenõrzés és darabolás
else
{
if(strval(value) != 0) // Ha nem nulla a value persze átalakítással mivel karakterláncként lett tárolva
{
strcat(dialogstring, value); // akkor összefûzés dialogstring változóba
strcat(dialogstring, \"\\n\"); // új sor jel hozzáadása
}
}
}
//print(dialogstring);
fclose(F); // A megnyitott fájl bezárása
ShowPlayerDialog(playerid, 5432, DIALOG_STYLE_MSGBOX, \" \", dialogstring, \"Ok\", \"\"); // Megjelenítés
}
return 1;
}
stock
ini_cut(line[], name[], value[], const delim = \'=\') // author by Zsolesszka
{
new
ch,
pos = 0,
pos2 = 0,
bool:valid = true;
while((ch = line[pos++]) >= \' \')
{
while(line[pos] == \' \') pos++;
if(ch == delim) { valid = false; continue; }
if(valid)
name[pos - 1] = ch, name[pos] = EOS;
else
value[pos2++] = ch, value[pos2] = EOS;
}
return valid;
}
Persze az ini_cut helyett használhatod a sscanf-et is, vagy bármi mást ami képes feldarabolni neked a beolvasott karakterláncot egy megadott karakter mentén (=).
Edit:
Késõn olvastam a hozzászólást, van rá mód hogy végig futtass egy ciklus utasítással egy enum által tárolt adatokat amit aztán szintén össze tudsz fûzni egy adott karakterláncba melyet megtudsz jeleníteni.
-
Inkább hagyom az egészet, nem lehet úgy megcsinálni, hogy majd lehessen is hivatkozni egy bizonyos listitemre, úgy hogy tudod is mi az...
-
te tudod :) ha ennyire volt fontos :)
én pl saját parancs motort írtam mert nekem egyszerre lehet dialogként és parancsként használni minden funkciót és ott nagyon egyszerûen megoldottam a dinamikus dialog címzést...tanulj tovább és neked is menni fog majd :)
-
Igyekszem :D . Egyik barátom szerint át kéne írjam a dinit MySQL-re, mert azzal könnyebb, sõt, jobb a szervernek is. Most azzal próbálkozom.
-
Igyekszem :D . Egyik barátom szerint át kéne írjam a dinit MySQL-re, mert azzal könnyebb, sõt, jobb a szervernek is. Most azzal próbálkozom.
hát én pl soha életemben nem használtam dinit :D alap fájl kezelési funkciókkal kezeltem csak fájlokat...dini jobban terhel csak egyszerûbb használni...
Megéri MySQL-ben tárolni az adatokat de attól még használhatsz config fájlokat...
-
Sziasztok! Megkérdezném, hogy hogyan tudnám lekérdezni egy fájl sorait? Konkrétan azt szeretném, hogy egy dini fájl minden sorának értékét lekérdezem és ami nem 0 azt kiírni egy dialogba.
-
Gondolom én ere gondolsz :D
-
Nem teljesen. Én azt szeretném, hogy fájlom sorainak értékét olvassa ki.
Pl. van 2 betûm:
a=5
b=6
És akkor azt szeretném, hogy dinibõl kiolvasva ezt a 2 értéket jelenítse meg nekem dialogba. Tehát, hogy a listitem dialog így nézzen ki formailag: 5\\n6.
-
Nem teljesen. Én azt szeretném, hogy fájlom sorainak értékét olvassa ki.
Pl. van 2 betûm:
a=5
b=6
És akkor azt szeretném, hogy dinibõl kiolvasva ezt a 2 értéket jelenítse meg nekem dialogba. Tehát, hogy a listitem dialog így nézzen ki formailag: 5\\n6.
Ja értem, akor én olvastam félre.
Példa:
new
a = 5,
b = 3;
if (a == 5 && b != 3)
{
print(\"Won\'t be printed\");
}
Forrás: Wiki SA-MP
-
De nem így :D . Egy ciklus kéne nekem, ami lefut a fájl minden során és kiírja azok soroknak értékeit. :D Nem tudom ennél jobban elmagyarázni.
-
http://wiki.sa-mp.com/wiki/Fread
Reading Line-by-Line részt nézd meg ebbõl menni fog vagy kell még segítség?
-
És ha valamivel (pl. sscanf) feladarabolnád /n szerint?
//A dinit nem annyira tudom, itt le kell kérned a fájlod teljes tartalmát a karilanc stringbe.
new karlanc[128],szam1,szam2;
sscanf(karlanc, \"d<\\n>d\", szam1, szam2)
//Mostmár azt csinálsz a számaiddal, amit akarsz.
Richard: Én is onnan néztem, ezen az elven csinálta, csak elavultabb megoldással.
-
soronként beolvassa a fájlt és összefûzi az = után levõ szöveget 1 stringbe...ezt kell csinálnia :)
-
Köszönöm a segítséget, nem sikerült megoldanom, de ki kell találnom valami mást. Nem tudom, hogy lehet megoldani egy táska tartalmának lekérdezését :D . Ennyi.
-
ezt próbáld ki:
new string[64],dialog[128],value;
new File:example = fopen(\"taska.txt\", io_read);
if(example)
{
while(fread(example, string))
{
if(sscanf(string,\"p<=>{s[16]}i\",value)) { continue; }
//
if(strlen(dialog))
{ format(dialog,sizeof(dialog),\"%s\\n%d\",dialog,value); }
else
{ format(dialog,sizeof(dialog),\"%d\",value); }
}
fclose(example);
}
-
Valahogy így próbáltam én is. Elmagyarázod, hogy mit jelent ez a sor? Konkrétabban ez érdekel: p<=>{s[16]}i .
if(sscanf(string,\"p<=>{s[16]}i\",value))
-
Ha jól értem, akkor a fájl tartalmát az egyenlõség jelek mentén darabolja fel, a string típusú dolgokat (pl. azt, hogy \"a\") kihagyja, majd az integer típusú dolgokat (amely ugye egy szám lesz, pl. az \"a=3\"-nál a 3) a value változóba rakja. Pl. annál, hogy \"a=3\" az = jelek mentén fogja feldarabolni a dolgot, az a betût nem fogja figyelembe venni, és csak a 3-ast tárolja el. Vagy legalábbis valami ilyesmi, de ha nekem nem sikerült, majd más érthetõbben elmagyarázza.
-
http://forum.sa-mp.com/showthread.php?t=120356
szerintem ezt olvasd végig nagyon sokat tanulhatsz belõle :)
én is innen néztem :) emlékeztem régebbrõl hogy van ilyen lehetõség és utána néztem...
-
Aha, vágom, köszi :D . Most már csak az a baj, hogy rájöttem nekem nem fájlból kell kiolvassa, hanem az enumokat kell leolvassa szépen, amit betölt ebbõl a fájlból bejelentkezéskor. Bocsi srácok! :D Csak annyit kérdeznék, hogy egy enum listát hogyan kell leolvasni? :D :D
-
Fájl sorainak beolvasása egy megadott fájlból, és kiíratása konzol ablakban.
new
File:F = fopen(\"dini.fuck\", io_read),
str[128];
if(F)
{
while(fread(F, str))
{
print(str);
}
fclose(F);
}
Ezt kell úgy módosítani hogy a beolvasott sorokat feldarabolja valamilyen eljárás az = (egyenlõségjel) mentén, majd össze kell fûzzni egy karakterláncba a kapott eredményt amit ki kell íratni dialogba.
Sajnos egy ideje nem szkriptelek és semmi kedvem nincs tesztelgetni de hamar össze dobok valamit.
stock
akarmi(playerid, filename[])
{
new
File:F = fopen(filename, io_read), // Fájl megnyitása
str[128], // karakterlánc tárolása
dialogstring[256], // kimeneti, illetve a végeredmény tárolása
name[64], // Jelenleg nincs rá szükség csak az eljáráshoz kell
value[64]; // érték melyeket majd össze kell fûzni a dialogstring-be ha nem nulla persze karakterláncként beolvasva
if(F) // Fájl megnyitásának ellenõrzése
{
while(fread(F, str)) // Addig olvasunk amíg van sor
{
if(ini_cut(str, name, value)) printf(\"Error. line: %s\", str); // Adat ellenõrzés és darabolás
else
{
if(strval(value) != 0) // Ha nem nulla a value persze átalakítással mivel karakterláncként lett tárolva
{
strcat(dialogstring, value); // akkor összefûzés dialogstring változóba
strcat(dialogstring, \"\\n\"); // új sor jel hozzáadása
}
}
}
//print(dialogstring);
fclose(F); // A megnyitott fájl bezárása
ShowPlayerDialog(playerid, 5432, DIALOG_STYLE_MSGBOX, \" \", dialogstring, \"Ok\", \"\"); // Megjelenítés
}
return 1;
}
stock
ini_cut(line[], name[], value[], const delim = \'=\') // author by Zsolesszka
{
new
ch,
pos = 0,
pos2 = 0,
bool:valid = true;
while((ch = line[pos++]) >= \' \')
{
while(line[pos] == \' \') pos++;
if(ch == delim) { valid = false; continue; }
if(valid)
name[pos - 1] = ch, name[pos] = EOS;
else
value[pos2++] = ch, value[pos2] = EOS;
}
return valid;
}
Persze az ini_cut helyett használhatod a sscanf-et is, vagy bármi mást ami képes feldarabolni neked a beolvasott karakterláncot egy megadott karakter mentén (=).
Edit:
Késõn olvastam a hozzászólást, van rá mód hogy végig futtass egy ciklus utasítással egy enum által tárolt adatokat amit aztán szintén össze tudsz fûzni egy adott karakterláncba melyet megtudsz jeleníteni.
-
Inkább hagyom az egészet, nem lehet úgy megcsinálni, hogy majd lehessen is hivatkozni egy bizonyos listitemre, úgy hogy tudod is mi az...
-
te tudod :) ha ennyire volt fontos :)
én pl saját parancs motort írtam mert nekem egyszerre lehet dialogként és parancsként használni minden funkciót és ott nagyon egyszerûen megoldottam a dinamikus dialog címzést...tanulj tovább és neked is menni fog majd :)
-
Igyekszem :D . Egyik barátom szerint át kéne írjam a dinit MySQL-re, mert azzal könnyebb, sõt, jobb a szervernek is. Most azzal próbálkozom.
-
Igyekszem :D . Egyik barátom szerint át kéne írjam a dinit MySQL-re, mert azzal könnyebb, sõt, jobb a szervernek is. Most azzal próbálkozom.
hát én pl soha életemben nem használtam dinit :D alap fájl kezelési funkciókkal kezeltem csak fájlokat...dini jobban terhel csak egyszerûbb használni...
Megéri MySQL-ben tárolni az adatokat de attól még használhatsz config fájlokat...