Проблема с записью в файл
#1

Ребят помогите пожалуйста. Мозг весь извертел так и не понял ничего.

в общем код.

Код:
forward OnPlayerBanPunct9(playerid);
public OnPlayerBanPunct9(playerid)
{
   new player[MAX_PLAYERS],string[256],string1[256], string2[256];
   GetPlayerName(playerid, player, sizeof(player));
   format(string, sizeof(string), "< %s(%d) ушел(шла) c сервера. (Бан)", player, playerid);
   SendClientMessageToAll(0xFFBF00AA,string);
   format(string2,sizeof(string2),"%s",player);
   format(string1,sizeof(string1),"%s(B)",player);
   SetPlayerName(playerid,string1);
   SendDeathMessage(INVALID_PLAYER_ID,playerid,201);
   SetPlayerName(playerid,string2);
   new serial[164];
   gpci(playerid, serial, sizeof(serial));
   new File:sfile = fopen("SerialBans.txt", io_readwrite);
   new sstring[162];
   format(sstring, sizeof(sstring), "%s\n", serial);
   fwrite(sfile, sstring);
   fclose(sfile);
   format(string, sizeof(string), "%s(%d) забанен(а): Нарушение пункта правил 8 с занесением в ЧС (серийный номер:%s)",player,playerid,serial);
   BanEx(playerid, string);
   return false;
}
код был взят из FS окстайла.

Суть такова: при записи в файл, каждая новая запись пишется в начале страницы, при этом заменяет ту, что была до этого, хотя при этом формат выдает иное
Reply
#2

вместо io_readwrite нужен io_append
Reply
#3

да проблема с перезаписью устранена, но запись не идет построчно (нужно каждый серийник на свою строку, а не в одну)
Reply
#4

Quote:
Originally Posted by Alexander_Petrov
Посмотреть сообщение
вместо io_readwrite нужен io_append
Тогда сервер будет падать, если файла не будет существовать.

Замени:
pawn Код:
new File:sfile = fopen("SerialBans.txt", io_readwrite);
На:
pawn Код:
new File:sfile;
if(fexist("SerialBans.txt")) sfile = fopen("SerialBans.txt", io_append);
else sfile = fopen("SerialBans.txt", io_readwrite);
Запись должна идти каждый раз в новой строке. Если нет, то замени:
pawn Код:
fwrite(sfile, sstring);
На:
pawn Код:
for(new i = 0; sstring[i] != EOS; i++) fputchar(sfile, sstring[i], false);
Reply
#5

окстайл. не сработало запись идет в одну строку
Reply
#6

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
Тогда сервер будет падать, если файла не будет существовать.
Падать будет только при попытки чтения из несуществующего файла: Fopen

Много лишних переменных, и использования неоптимальных функций.
pawn Код:
forward OnPlayerBanPunct9(playerid);
public OnPlayerBanPunct9(playerid)
{
    new playerName[MAX_PLAYERS_NAME],
        string[256],
        serial[256],
        tempName[MAX_PLAYERS_NAME];
    GetPlayerName(playerid, playerName, sizeof(playerName));

    format(string, sizeof(string), "< %s(%d) ушел(шла) c сервера. (Бан)", playerName, playerid);
    SendClientMessageToAll(0xFFBF00AA, string);

    tempName = playerName;
    strcat(tempName, "(B)");
    SetPlayerName(playerid, tempName);
    SendDeathMessage(INVALID_PLAYER_ID, playerid, 201);
    SetPlayerName(playerid, playerName);

    gpci(playerid, serial, sizeof(serial));

    new File:sfile = fopen("SerialBans.txt", io_append);
    format(string, sizeof(string), "%s\n", serial);
    fwrite(sfile, string);
    fclose(sfile);

    format(string, sizeof(string), "%s(%d) забанен(а): Нарушение пункта правил 8 с занесением в ЧС (серийный номер:%s)", playerName, playerid, serial);
    BanEx(playerid, string);
    return false;
}
При этом используется недокументированная запрещенная функция, закрыто.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)