Русское сообщество по скриптингу

чтения запись и удаления строки в файле  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

чтения запись и удаления строки в файле

Сообщение RSO_ » 26 окт 2019, 17:34

qq all суть плагина выдавать флаги игрокам
пример вроде как пашет но после удаления и записи строки остаются отступы
если есть проще или оптимальные варианты подскажите

Код: Выделить всё
#include <amxmodx>
#include <amxmisc>

#define PLUGIN "write_file txt"
#define VERSION "0.1"
#define AUTHOR "RSO"


public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_clcmd("say test", "ftest")
    register_clcmd("say del", "dell")
}

public ftest( id )
{
    
    if
(!is_user_connected(id)){    // if(!is_user_hltv(id) && !is_user_bot(id))
        //continue;
    }
    
    new player_name
[32] 
    get_user_name
(id, player_name, 31) 
    
    new xz
[] = ";abc" 
    new name_flafs
[50]
    format(name_flafs, 50, "%s%s",player_name,xz)
    
    write_file
("addons/amxmodx/configs/names_adm.txt",name_flafs,-1)     
}

public dell( id )
{
    new player_name[32] 
    get_user_name
(id, player_name, 31) 
    
    new szText
[64]
    new lenq
    
    
//new szArg1[10], szArg2[25]
    //new szString[] = 
    //strtok(szString, szArg1, charsmax(szArg1), szArg2, charsmax(szArg2), ';')
    
    new xz
[] = ";abc"
    new name_flafs[50]
    format(name_flafs, 50, "%s%s",player_name,xz) //
    
    
//количество строк в файле.
    new len = file_size("addons/amxmodx/configs/names_adm.txt",1)
    
    for
(new i = 0; i < len; i++) 
    
{
        //Читаем файл 
        read_file("addons/amxmodx/configs/names_adm.txt",i,szText,63,lenq)
        
        
        if
(equal(szText, name_flafs))
        {
            write_file("addons/amxmodx/configs/names_adm.txt", "", i);
            //ftell() - ?
        }    
        
    
}



write_file("addons/amxmodx/configs/names_adm.txt", "", i);
слава великой сонтаранской империи !
Аватара пользователя
RSO_
 
Сообщения: 280
Зарегистрирован: 20 окт 2019, 21:40
Откуда: от верблюда
Благодарил (а): 45 раз.
Поблагодарили: 20 раз.
Опыт программирования: Меньше недели
Языки программирования: . . . 100 ISQ

Re: чтения запись и удаления строки в файле

Сообщение RSO_ » 01 ноя 2019, 19:59

как я понял удалить отступ в файле такой функции нет
только через костыль write_file("addons/amxmodx/configs/names_adm.txt", "", i);
" " - костыль

Добавлено спустя 3 часа 18 минут 54 секунды:
т.e надо всё в массив за пи-хнуть или здячить.
подскажите плиз
слава великой сонтаранской империи !
Аватара пользователя
RSO_
 
Сообщения: 280
Зарегистрирован: 20 окт 2019, 21:40
Откуда: от верблюда
Благодарил (а): 45 раз.
Поблагодарили: 20 раз.
Опыт программирования: Меньше недели
Языки программирования: . . . 100 ISQ

Re: чтения запись и удаления строки в файле

Сообщение RSO_ » 02 ноя 2019, 01:58

stock delete_string(s_file[],i_line)
{
if(!file_exists(s_file)||!s_file[0])
return 0

new s_buffer[1024]

new i_file=fopen(s_file,"rt")

new Array:a_data=ArrayCreate(1024)

while(!feof(i_file))
{
fgets(i_file,s_buffer,1023)

trim(s_buffer)

ArrayPushString(a_data,s_buffer)
}

fclose(i_file)

new i_size=ArraySize(a_data)

if(!i_size||i_line>i_size-1||i_line<0)
{
ArrayDestroy(a_data)

return 0
}

delete_file(s_file)

i_file=fopen(s_file,"wt")

for(new a;a<i_size;a++)
{
if(a==i_line)
continue

ArrayGetString(a_data,a,s_buffer,1023)

format(s_buffer,1023,"%s^n",s_buffer)

fputs(i_file,s_buffer)
}

fclose(i_file)

ArrayDestroy(a_data)

return 1
}
слава великой сонтаранской империи !
Аватара пользователя
RSO_
 
Сообщения: 280
Зарегистрирован: 20 окт 2019, 21:40
Откуда: от верблюда
Благодарил (а): 45 раз.
Поблагодарили: 20 раз.
Опыт программирования: Меньше недели
Языки программирования: . . . 100 ISQ

Re: чтения запись и удаления строки в файле

Сообщение hren_morjovui » 06 ноя 2019, 06:20

Код: Выделить всё
//Из исходника admin.sma
AddAdmin(id, auth[], accessflags[], password[], flags[], comment[]="")
{
    // Make sure that the users.ini file exists.
    new configsDir[64]
    get_configsdir(configsDir, 63)
    format(configsDir, 63, "%s/users.ini", configsDir)

    if (!file_exists(configsDir))
    {
        console_print(id, "[%s] File ^"%s^" doesn't exist.", PLUGIN, configsDir)
        return
    
}

    // Make sure steamid isn't already in file.
    new line = 0, textline[256], len
    const SIZE 
= 63
    new line_steamid
[SIZE + 1], line_password[SIZE + 1], line_accessflags[SIZE + 1], line_flags[SIZE + 1], parsedParams
    
    
// <name|ip|steamid> <password> <access flags> <account flags>
    while ((line = read_file(configsDir, line, textline, 255, len)))
    {
        if (len == 0 || equal(textline, ";", 1))
            continue // comment line

        parsedParams = parse(textline, line_steamid, SIZE, line_password, SIZE, line_accessflags, SIZE, line_flags, SIZE)
        
        if 
(parsedParams != 4)
            continue    // Send warning/error?
        
        if 
(containi(line_flags, flags) != -&& equal(line_steamid, auth))
        {
            console_print(id, "[%s] %s already exists!", PLUGIN, auth)
            return
        
}
    }

    // If we came here, steamid doesn't exist in users.ini. Add it.
    new linetoadd[512]
    
    if 
(comment[0]==0)
    {
        formatex(linetoadd, 511, "^r^n^"%s^" ^"%s^" ^"%s^" ^"%s^"", auth, password, accessflags, flags)
    }
    else
    
{
        formatex(linetoadd, 511, "^r^n^"%s^" ^"%s^" ^"%s^" ^"%s^" ; %s", auth, password, accessflags, flags, comment)
    }
    console_print(id, "Adding:^n%s", linetoadd)

    if (!write_file(configsDir, linetoadd))
        console_print(id, "[%s] Failed writing to %s!", PLUGIN, configsDir)
}


ну или использовать
Код: Выделить всё
set_user_flags(index,flags=-1,id=0)
и
Код: Выделить всё
remove_user_flags(index,flags=-1,id=0);
"В этом мире неизбежны три вещи: смерть, налоги и гравитация."
Аватара пользователя
hren_morjovui
 
Сообщения: 258
Зарегистрирован: 29 май 2018, 09:15
Благодарил (а): 88 раз.
Поблагодарили: 22 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
PHP
jQuery

Re: чтения запись и удаления строки в файле

Сообщение RSO_ » 07 ноя 2019, 23:23

Код: Выделить всё


#define PLUGIN "name_string"
#define VERSION "1.0"
#define AUTHOR "Egor1496 & RSO"

static Array:g_a_data

public delete_name_string
(id)
{
    
    new player_name
[32] 
    get_user_name
(id, player_name, 31) 
    
    g_a_data
=ArrayCreate(1024)
    new i_file = fopen("addons/amxmodx/configs/names_adm.txt","rt")
    
    
// Если произошла ошибка открытии файла - прекращаем выполнение кода
    //if(!i_file)
    //{
    //return PLUGIN_CONTINUE
    //}
    
    new s_buffer
[1024]
    
    while
(!feof(i_file))
    {
        //Получаем следующую строку из файла в s_buffer
        fgets(i_file,s_buffer,1023)
        
        
        
        
// Очищаем строку от каретки
        trim(s_buffer)
        
        ArrayPushString
(g_a_data,s_buffer)
        
    
}
    
    
// Закрываем файл по индексу
    fclose(i_file)

    delete_file("addons/amxmodx/configs/names_adm.txt")
    
//--------------------------------------------------------------------------------------------    
    
    fopen
("addons/amxmodx/configs/names_adm.txt","rt")
    
    new i_size
=ArraySize(g_a_data)
    
    
// Если размер нулевой - прекращаем работу, т.к. массив пуст
    //if(!i_size)
    //{
    //return PLUGIN_CONTINUE
    //}
    
    new s2_buffer
[22]
    new index = 0
    
    for
(new a; a < i_size; a++)
    {
        
        ArrayGetString
(g_a_data,a,s2_buffer,20)
        
        if
(!equal(s2_buffer, player_name) && strlen(s2_buffer) != 0 ) 
        
{

client_print(id, print_chat, "FOR: %s", s2_buffer) ///////////////////////////////////////////////////
        
            write_file
("addons/amxmodx/configs/names_adm.txt", s2_buffer, index)
            index++
        }
        
    
}
    
    fclose
(i_file)
    ArrayClear(g_a_data)
    return PLUGIN_CONTINUE


Добавлено спустя 11 минут 23 секунды:
работает примерно так
читает с файла, записывает в хитрый массив Array:g_a_data, закрывает удаляет
создаёт и записывает уже без нашего ника если файл пустой то просто удаляет
всё для того чтобы не было отступов (пустых строк) :dance2:

Добавлено спустя 23 минуты 26 секунд:
с чтениям пока не разобрался +
надо при коннекте игрока на подлинность проверять
get_user_info(id,"_pw",value,10) - не совсем удобно
слава великой сонтаранской империи !
Аватара пользователя
RSO_
 
Сообщения: 280
Зарегистрирован: 20 окт 2019, 21:40
Откуда: от верблюда
Благодарил (а): 45 раз.
Поблагодарили: 20 раз.
Опыт программирования: Меньше недели
Языки программирования: . . . 100 ISQ

Re: чтения запись и удаления строки в файле

Сообщение xbass13 » 08 ноя 2019, 10:03

Имхо, такое лучше на базу повесить, файлы - тупик
Аватара пользователя
xbass13
 
Сообщения: 96
Зарегистрирован: 13 июн 2012, 21:20
Благодарил (а): 36 раз.
Поблагодарили: 35 раз.
Опыт программирования: Больше трех лет
Языки программирования: pawn, c++, js, php

Re: чтения запись и удаления строки в файле

Сообщение RSO_ » 08 ноя 2019, 11:41

xbass13 писал(а):Имхо, такое лучше на базу повесить, файлы - тупик

кавоо! повесить меня повесить да я сам повешусь
если серьёзно на базу данных повесить ?
и почему лучше приведи пример если не сложно
я только начал изучать это дело
слава великой сонтаранской империи !
Аватара пользователя
RSO_
 
Сообщения: 280
Зарегистрирован: 20 окт 2019, 21:40
Откуда: от верблюда
Благодарил (а): 45 раз.
Поблагодарили: 20 раз.
Опыт программирования: Меньше недели
Языки программирования: . . . 100 ISQ

Re: чтения запись и удаления строки в файле

Сообщение xbass13 » 08 ноя 2019, 23:11

Забрать из БД данные по игроку по ключу (ник, стим_ид).
Удалить запись в БД по тому же ключу, если были получены данные.

Далее это можно довернуть под хотелки - добавить форму, доступную только главному админу, на сайт, с помощью этой формы добавлять записи в базу. Потом прикрутить магазин. И т.д.

Смотря что в итоге должно выйти, в финале. Возможно и того, как это реализовано у вас (осталось чуть допилить), хватит для ваших нужд, а база - лишнее
Аватара пользователя
xbass13
 
Сообщения: 96
Зарегистрирован: 13 июн 2012, 21:20
Благодарил (а): 36 раз.
Поблагодарили: 35 раз.
Опыт программирования: Больше трех лет
Языки программирования: pawn, c++, js, php

Re: чтения запись и удаления строки в файле

Сообщение RSO_ » 09 ноя 2019, 11:02

xbass13 писал(а):Забрать из БД данные по игроку по ключу (ник, стим_ид).
Удалить запись в БД по тому же ключу, если были получены данные.

Далее это можно довернуть под хотелки - добавить форму, доступную только главному админу, на сайт, с помощью этой формы добавлять записи в базу. Потом прикрутить магазин. И т.д.

Смотря что в итоге должно выйти, в финале. Возможно и того, как это реализовано у вас (осталось чуть допилить), хватит для ваших нужд, а база - лишнее


нечего не понял но понравилось :) я имел виду пример кода но так тоже нормально
да и вроде как и так неплохо работает
слава великой сонтаранской империи !
Аватара пользователя
RSO_
 
Сообщения: 280
Зарегистрирован: 20 окт 2019, 21:40
Откуда: от верблюда
Благодарил (а): 45 раз.
Поблагодарили: 20 раз.
Опыт программирования: Меньше недели
Языки программирования: . . . 100 ISQ

Re: чтения запись и удаления строки в файле

Сообщение RSO_ » 10 ноя 2019, 00:40

как записать, дописать строку после ника если запись есть то проигнорить
пример: "12а3" буква "а" есть не дописываем после тройки "а"

Код: Выделить всё
static Array:g_a_data

public newstring
(id)
{
    
    
    new player_name
[32] 
    get_user_name
(id, player_name, 31) 
    
    
    g_a_data
=ArrayCreate(1024)
    
    new i_file 
= fopen("addons/amxmodx/configs/names_adm.txt","r+") 
    
    
//Если произошла ошибка открытии файла - прекращаем выполнение кода
    if(!i_file)
    {
        return;
    }
    
    
    new s_buffer
[1024]
    
    new left1
[25]
    new right2[25]
    
    
    for 
(new i; i < file_size("addons/amxmodx/configs/names_adm.txt", 1); i++ ) // while(!feof(i_file)) //
    {
        
        
//Получаем следующую строку из файла в s_buffer
        fgets(i_file,s_buffer,1023)
        // Очищаем строку от каретки
        trim(s_buffer)
        // Добавляем эту строку в массив
        ArrayPushString(g_a_data,s_buffer)
        
        
        
//';' маркер(метка) для разделения
        strtok(s_buffer, left1, charsmax(left1), right2, charsmax(right2), ';')    
        
        
        
        if
(equal(left1, player_name)) 
        
{
            
            
//break;
            format(player_name, 50, "%s%s%s", player_name, ";", 123) 
            
            fputs
(i_file, s_buffer) // -- ?
            
            client_print
(id, print_chat, "_MSG_:%s", s_buffer)
        }
    }
    
    
    


чот не фурычит fputs(i_file, s_buffer) // -- ?
слава великой сонтаранской империи !
Аватара пользователя
RSO_
 
Сообщения: 280
Зарегистрирован: 20 окт 2019, 21:40
Откуда: от верблюда
Благодарил (а): 45 раз.
Поблагодарили: 20 раз.
Опыт программирования: Меньше недели
Языки программирования: . . . 100 ISQ

След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 15