Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Odczyt treści w jednej linii z plikuProblem z odczytaniem kolejnej informacji w pliku, jednej linii.

string odczyt pobranie treści pliku

Najlepsza odpowiedź Linux', 23.11.2015 22:04

Tak w skrócie to będzie tak:

 

Odczyt

new String:file[256], String:steamid[64];
Format(steamid, sizeof(steamid), "%s", steam[client]);
BuildPath(Path_SM, file, sizeof(file), "configs/plik.txt");
new Handle:kv = CreateKeyValues("Tresc");
FileToKeyValues(kv, file);
KvGetString(kv, steamid, klucz[client], sizeof(klucz[]));
TrimString(klucz[client]);
CloseHandle(kv);

Zapis

new String:file[256], String:steamid[64];
Format(steamid, sizeof(steamid), "%s", steam[client]);
BuildPath(Path_SM, file, sizeof(file), "configs/plik.txt");
new Handle:kv = CreateKeyValues("Tresc");
FileToKeyValues(kv, file);
KvSetString(kv, steamid, "okreslony string");
KvRewind(kv);
KeyValuesToFile(kv, file);
CloseHandle(kv);

Jeżeli w wpisie znajdzie się steamid gracza to ustawi mu określony string. Przykładowy plik powinien wyglądać tak:

"Tresc"
{
	"numer steam 1"	"string 1"
	"numer steam 2"	"string 2"
}

Robiłem to na szybko ale wydaje mi się, że powinno działać.

Przejdź do postu


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
8 odpowiedzi w tym temacie

#1 Ini

    Początkujący

  • Użytkownik

Reputacja: 2
Nowy

  • Postów:16
  • Imię:Lukas
  • Lokalizacja:Poland
Offline

Napisano 23.11.2015 11:07

Witam serdecznie grono AMXX.

 

Chciałbym odczytać treść ( X ) w pliku txt, która jest w jednej linii po cudzysłowiu i przerobienie/pobranie jej jako String by mogła być ona dalej użyta w kodzie.

 

Jeden z moich skryptów wykonuję akcję, w której wysyła treści do pliku i tworzy taki plik z "STEAM_ID:0:0:00000000" "X"

Chciałbym zrobić tak jezeli steamid zgadza się z połączonym clientem wyświetla mu informację o X po przez CPrinttoChat.

decl String:path[PLATFORM_MAX_PATH][128];
BuildPath(Path_SM,path,PLATFORM_MAX_PATH,"test.txt");
new Handle:fileHandle=OpenFile(path,"r"); //
WriteFileLine(fileHandle,"\"STEAM_ID:0:0:00000000\" \"X\" ");

X - potrzebne pobranie.

 

Każda pomoc jest bardzo cenna.

Dziekuje za wszelkie zainteresowanie się moim problemem. :)


  • +
  • -
  • 1

#2 Sniper Elite

    Master

  • Power User

Reputacja: 176
Profesjonalista

  • Postów:981
  • GG:
  • Imię:Konrad
  • Lokalizacja:Skryptolandia
Offline

Napisano 23.11.2015 11:51

Chcesz X wyświetlić graczowi jeżeli mu się steamid zgadza?

Pomiędzy X a steamid dodaj coś co będzie punktem podziału dla funkcji ExplodeString. Pamiętaj żeby było to coś co zwykle nie występuje w zdaniu, jakiś ciąg typu:

$_/\_$

Później taki string dzielisz i masz oddzielnie steam i wiadomość.


  • +
  • -
  • 0

Kontakt:

Steam: CSnajper

GG: 4394855

 

Na steam i GG pomagam wyłącznie odpłatnie.


#3 Ini

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 2
Nowy

  • Postów:16
  • Imię:Lukas
  • Lokalizacja:Poland
Offline

Napisano 23.11.2015 12:31

Tak, chciałbym by taka wiadomość pojawiała się naprzykład po 5 sekundach przez CreateTimer od wejścia na serwer przez CPrintToChat.

 

Czyli jak dobrze zrozumiałem muszę wstawić ciąg znaków, który oddziela te wiadomości.

 

"STEAM_ID:0:0:00000000" $_/\_$ "X"

 

Czyli zakładam nowy String.

new String:szukajx[15][15];
ExplodeString(exstring[0], "$_/\_$", szukajx, 15, 15);

I ta wiadomość już jest w szukajx pobrana?

Czy potrzeba dodać do niej jeszcze coś ?

 

 

Wybaczcie, ale na prawdę nie rozumiem systemu działania tej funkcji i byłbym bardzo wdzięczny by ktoś podał mi ten kod na tym przykładzie bym mógł sobie go na spokojnie zobaczyć i przeanalizować. ://

 

Użytkownik Ini edytował ten post 23.11.2015 12:36

  • +
  • -
  • 0

#4 Sniper Elite

    Master

  • Power User

Reputacja: 176
Profesjonalista

  • Postów:981
  • GG:
  • Imię:Konrad
  • Lokalizacja:Skryptolandia
Offline

Napisano 23.11.2015 12:55

Nie pamiętam dokładnie jak ta funkcja szła, nie jestem w domu, ale rozmiar chyba trochę za duży:

new String:szukajx[2][15];
ExplodeString(exstring[0], "$_/\_$", szukajx, 2, 15);

Później steamid masz w szukajx[0], a wiadomość w szukajx[1].


  • +
  • -
  • 0

Kontakt:

Steam: CSnajper

GG: 4394855

 

Na steam i GG pomagam wyłącznie odpłatnie.


#5 Ini

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 2
Nowy

  • Postów:16
  • Imię:Lukas
  • Lokalizacja:Poland
Offline

Napisano 23.11.2015 13:08

Aaa czyli tabela odpowiada za konkretne wiadomości po znaku $_/\_$ ?

Czyli znak musi być przed całym wierszem ?

$_/\_$ "STEAM_ID:0:0:00000000" "X"

Skoro odniesienie jest do 2 treści ?


Użytkownik Ini edytował ten post 23.11.2015 13:09

  • +
  • -
  • 0

#6 Sniper Elite

    Master

  • Power User

Reputacja: 176
Profesjonalista

  • Postów:981
  • GG:
  • Imię:Konrad
  • Lokalizacja:Skryptolandia
Offline

Napisano 23.11.2015 15:08

$_/\_$

To jest punkt podziału ciągu, więc musi być w środku, pierwsza część ciągu zostanie zapisana do szukajx[0], druga część zaraz po $_/\_$ zapisana zostanie do szukajx[1] itd. jeżeli tego znaku specjalnego byłoby więcej. Natomiast sam znak specjalny nie będzie zapisany do żadnej zmiennej.

 

Przykład:

enw String:exstring = "STEAMID:2:072365782635 $_/\_$ Wiadomosc dla gracza"
new String:szukajx[2][15];
ExplodeString(exstring[0], "$_/\_$", szukajx, 2, 15);

szukajx[0] = STEAMID:2:072365782635

szukajx[1] = Wiadomosc dla gracza


  • +
  • -
  • 1

Kontakt:

Steam: CSnajper

GG: 4394855

 

Na steam i GG pomagam wyłącznie odpłatnie.


#7 plx211

    Wszechpomocny

  • Użytkownik

Reputacja: 231
Wszechwidzący

  • Postów:397
  • Lokalizacja:Polska
Offline

Napisano 23.11.2015 16:48

Można to rozwiązać na kilka sposobów :)

1) zamiast dodawać "klucz" (jak radzi snajper), można użyć wyrażeń regularnych (regexp)

to:

"jakies znaki" "jakies znaki"

uzyskasz przy pomocy takie wyrażenia (poniższe wyrażenie prawdopodobnie da się skrócić, nie ma się co go bać :), nie wychwytuje znaków specjalnych):

/\"[0-9a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]+\"\s\"[0-9a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]+\"/

a następnie explodować " "

 

2) zmodyfikować zapis na:

WriteFileLine(fileHandle,"\"STEAM_ID:0:0:00000000\" \"X\"\n");

wczytywać po linij

a następnie explodować " "

 

3) przenieść zapis/odzczyt na keyvalues

dostaniesz wtedy wygodny interfejs

 

4) przenieść się na sql

dostaniesz wtedy wygodny interfejs (pod warunkiem że znasz sql)

najwydajniejsze rozwiązanie w przypadku dużej liczby danych

 

@edit

skrócony regex który pozwala na znaki specjalne:

/\"[^"]+\"\s\"[^"]+\"/

@edit2

możesz także wyłapać konkretne steamid tym:

/\"STEAM:0:0123456\"\s\"[^"]+\"/

lub zaczynające się od danego początku tym:

/\"STEAM:0:012+\"\s\"[^"]+\"/

Użytkownik plx211 edytował ten post 23.11.2015 17:07

  • +
  • -
  • 1

#8 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 23.11.2015 21:29

Akurat przy SM nie bawiłem się z plikami, ale coś nie chce mi się wierzyć, że tutaj nie ma czegoś takiego jak przy AMXX, że do pliku normalnie zapisujemy coś w tej sposób
"klucz" "wartość"
jeśli w kluczu lub wartości chcemy mieć ", to dajemy \"
a potem przy pomocy jakiejś metody wyciągamy kolejno argumenty z tej linii.
sebul (23.11.2015 21:30):
I chyba nawet jest to ta metoda "BreakString".

  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#9 Linux'

    Pan Pomocny

  • Power User

Reputacja: 549
Wszechwiedzący

  • Postów:1 501
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:AmxMod i SourceMod
Offline

Napisano 23.11.2015 22:04   Najlepsza odpowiedź

Tak w skrócie to będzie tak:

 

Odczyt

new String:file[256], String:steamid[64];
Format(steamid, sizeof(steamid), "%s", steam[client]);
BuildPath(Path_SM, file, sizeof(file), "configs/plik.txt");
new Handle:kv = CreateKeyValues("Tresc");
FileToKeyValues(kv, file);
KvGetString(kv, steamid, klucz[client], sizeof(klucz[]));
TrimString(klucz[client]);
CloseHandle(kv);

Zapis

new String:file[256], String:steamid[64];
Format(steamid, sizeof(steamid), "%s", steam[client]);
BuildPath(Path_SM, file, sizeof(file), "configs/plik.txt");
new Handle:kv = CreateKeyValues("Tresc");
FileToKeyValues(kv, file);
KvSetString(kv, steamid, "okreslony string");
KvRewind(kv);
KeyValuesToFile(kv, file);
CloseHandle(kv);

Jeżeli w wpisie znajdzie się steamid gracza to ustawi mu określony string. Przykładowy plik powinien wyglądać tak:

"Tresc"
{
	"numer steam 1"	"string 1"
	"numer steam 2"	"string 2"
}

Robiłem to na szybko ale wydaje mi się, że powinno działać.


  • +
  • -
  • 1

b35020692_qesnxqa.png






Również z jednym lub większą ilością słów kluczowych: string, odczyt, pobranie, treści, pliku

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych