Удаление строки из файла .txt

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Здравствуйте, кто знает как удалить строку из файла .txt

Есть вариант из файла записывать в массив, из массива удалять строку, удалять файл, создавать файл и записывать каждую строку заново из массива, но такое себе вариант.
 

hirowatch

Живет ХЛмод`ом
Сообщения
2,722
Реакции
1,634
1649873697030.png
🤣
 

Патриот Анархии

Чиполлино
Сообщения
113
Реакции
68
А если плагином sourcepawn?
Вы можете попробовать прочитать весь файл, пропустить нужную строку и перезаписать его. И да, я сейчас говорю не про массив, про который вы писали выше.
PS: лучше бы прикрепить пример файла ._.
Оффтоп
 

Патриот Анархии

Чиполлино
Сообщения
113
Реакции
68
Во так записываю в файл
C-подобный:
STEAM_0:1:259653923 | NEW NAME
STEAM_0:1:965543929 | we
STEAM_0:1:296855392 | 3213
Могу я поинтересоваться, в каких целях вы делаете такого рода файл? Возможно я не совсем понял, в чём ценность, но пока создания бд выглядит более правильным решением, имхо.
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Могу я поинтересоваться, в каких целях вы делаете такого рода файл? Возможно я не совсем понял, в чём ценность, но пока создания бд выглядит более правильным решением, имхо.
Записываю кому админ сменил ник и при пере заходе из этого файла меняю ему обратно если он есть там.
На счет бд не стал его использовать так как удобно файлом, все видно списком, удобно смотреть и редактировать без доп программы SQLiteStudio
Может, стоит KV заюзать? Там вроде можно удалить ключ просто
Можно, но почему то захотел файлом. Если не найдется нормальное решение то придется KV использовать.
 

DaLLuZZ

Участник
Сообщения
34
Реакции
17
может стоит таблицу в базе данных создать вместо файла?
Нельзя просто из файла удалить строку (если она не последняя), придется перезаписывать все, за исключением этой строки.
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Есть у меня плагин, делающий то, что тебе нужно в первом посте, если правильно понял.
Вот та часть кода, может, поможет.
C-подобный:
public Action:Command_DeleteLegend(client, args)
{
    new String:arg[128];
    GetCmdArgString(arg, sizeof(arg));
    
    if(StrContains(arg, "steam_", false) != -1)
    {
        new String:SteamID[128];
        SteamID = arg;
        TrimString(SteamID);
        
        new check = FindStringInArray(Legends_Array, SteamID);
        if(check != -1)
        {
            RemoveFromArray(Legends_Array, check);
            new Handle:file;
            file = OpenFile(Legends_File, "w");
            for (new i = 0; i < GetArraySize(Legends_Array); i++)
            {
                new String:new_SteamID[128];
                GetArrayString(Legends_Array, i, new_SteamID, sizeof(new_SteamID));
                WriteFileLine(file, new_SteamID);
            }
            CloseHandle(file);
            
            new String:i_SteamID[128];
            for (new i = 1; i <= MaxClients; i++)
            {
                if(IsClientInGame(i))
                {
                    GetClientAuthId(i, AuthId_Steam2, i_SteamID, sizeof(i_SteamID));
                    if(StrEqual(i_SteamID, SteamID))
                    {
                        PLAYER_LEGEND[i] = false;
                        break;
                    }
                }
            }
            
            PrintToChat(client, " \x08[\x10Legends\x08] SteamID \x01%s\x08 успешно удалён из списка легенд.", SteamID);
        }
        else
        {
            PrintToChat(client, " \x08[\x10Legends\x08] Игрока со SteamID \x01%s\x08 нет в списке легенд.", SteamID);
        }
    }
    else
    {
        new target = FindLegend(client, arg);
        
        if(target != -1)
        {
            new String:SteamID[128];
            GetClientAuthId(target, AuthId_Steam2, SteamID, sizeof(SteamID));
        
            new check = FindStringInArray(Legends_Array, SteamID);
            if(check != -1)
            {
                RemoveFromArray(Legends_Array, check);
                new Handle:file;
                file = OpenFile(Legends_File, "w");
                for (new i = 0; i < GetArraySize(Legends_Array); i++)
                {
                    new String:new_SteamID[128];
                    GetArrayString(Legends_Array, i, new_SteamID, sizeof(new_SteamID));
                    WriteFileLine(file, new_SteamID);
                }
                CloseHandle(file);
                PrintToChat(client, " \x08[\x10Legends\x08] Игрок \x01%N\x08 (\x01%s\x08) успешно удалён из списка легенд.", target, SteamID);
                PLAYER_LEGEND[target] = false;
            }
            else
            {
                PrintToChat(client, " \x08[\x10Legends\x08] Игрока \x01%N\x08 (\x01%s\x08) нет в списке легенд.", target, SteamID);
            }
        }
        else PrintToChat(client, " \x08[\x10Legends\x08] Игрока не найден, используйте удаление по SteamID.");
    }
    
    return Plugin_Stop;
}
 

xstage

🏹
Сообщения
726
Реакции
754
Есть темка - Remove Line from a file - AlliedModders

Если только так:
C-подобный:
    char szPath[256];
    BuildPath(Path_SM, szPath, sizeof(szPath), "configs/file.txt");
    
    File hFile = OpenFile(szPath, "r");
    ArrayList hList = new ArrayList(ByteCountToCells(128));
    
    char szLine[128];
    
    while(!hFile.EndOfFile() && hFile.ReadLine(szLine, sizeof(szLine)))
    {
        if(StrContains(szLine, "we") == -1)
        {
            hList.PushString(szLine);
        }
    }
    
    delete hFile;
    
    if(hList.Length > 0)
    {
        hFile = OpenFile(szPath, "w");
    
        char szBuffer[128];
        for(int i = 0; i < hList.Length; i++)
        {
            hList.GetString(i, szBuffer, sizeof(szBuffer));
            TrimString(szBuffer);
            hFile.WriteLine(szBuffer, false);
        }
        
        delete hFile;
    }
    
    delete hList;
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,335
Если при работе с файлом вы меняете длину файла (уменьшаете) или смещаете его содержимое, то ничего другого, кроме как перезаписать файл, не остаётся (это связано с тем, каким образом файлы хранятся физически на самом диске). Обычно это делается следующим образом: открывается исходный файл, параллельно создается новый файл с припиской к имени, допустим, file.txt и file.new.txt. В вашем случае содержимое из file.txt считывается построчно, и, если строка остается в файле, то сразу записывается в file.new.txt. Таким образом, вы избегаете создание массива для хранения всего содержимого файла. После того, как весь файл был прочитан, file.txt удаляется (DeleteFile), а file.new.txt переименовывается (RenameFile) в file.txt. Так работает большинство программ, включая Microsoft Office и многие другие.
Редким исключением из этого алгоритма является случай, когда вы заменяете одну последовательность символов на другую равной длины. В этом случае можно сразу перезаписать нужные байты в файле.
 
Сверху Снизу