SA-MP Forums Archive
Проблема с записью в файл - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Проблема с записью в файл (/showthread.php?tid=471360)



Проблема с записью в файл - Кирилл - 22.10.2013

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

в общем код.

Код:
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 окстайла.

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


Re: Проблема с записью в файл - Alexander_Petrov - 22.10.2013

вместо io_readwrite нужен io_append


Re: Проблема с записью в файл - Кирилл - 22.10.2013

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


Re: Проблема с записью в файл - OKStyle - 23.10.2013

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);



Re: Проблема с записью в файл - Кирилл - 23.10.2013

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


Re: Проблема с записью в файл - Stepashka - 23.10.2013

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;
}
При этом используется недокументированная запрещенная функция, закрыто.