За последние 24 часа нас посетил 26461 программист и 1814 роботов. Сейчас ищут 1006 программистов ...

Как удалить последнюю запись из текстового файла?

Тема в разделе "PHP для новичков", создана пользователем Sinsir, 12 окт 2009.

  1. Sinsir

    Sinsir Активный пользователь

    С нами с:
    27 май 2009
    Сообщения:
    60
    Симпатии:
    0
    Подскажите есть ли такая возможность в ПХП удалить последний символ (или запись) из текстового файла?
    Например мы добавляем запись в текстовый файл:
    $data=345;
    $filename="data.txt";
    $filepointer=fopen($filename, "a+");
    fwrite($filepointer, "$data");
    fclose($filename);
    и допустим у нас уже есть несколько записей в текстовом файле до этого:
    12 345
    Как можно удалить только последнюю запись не трогая предыдущую?
     
  2. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    PHP:
    1. <?php
    2. $data='345';
    3. $filename = "data.txt";
    4. $handler = fopen($filename, "a+");
    5. fwrite($handler, $data . '\r\n');
    6. fclose($handler);
    7.  
    8. //Удаление последней записи
    9. $file = file($filename);
    10. array_pop($file);
    11. //Пересобираем строку
    12. $str = implode('\r\n', $file);
    13. file_put_contents($filename, $str);
    14. ?>
     
  3. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    file_set_contents - нету
    есть file_put_contents
     
  4. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    да действительно сглупил (своя функция) - исправляю
     
  5. Sinsir

    Sinsir Активный пользователь

    С нами с:
    27 май 2009
    Сообщения:
    60
    Симпатии:
    0
    Я несовсем понял что именно значит "пересобираем строку"( я только учусь- новичек), и что конкретно происходит в этих 3 строках:
    array_pop($file);(здесь, как я понимаю, мы строим массив из текстового файла, где каждой строке фала соответствует ячейка массива. Если да то такой вариант мне несовсем подходит , потому что я немогу ставитбь перенос строки после добавления данных. Мне нужно чтобы все было в одной строке, потомучто в другой строке уже идут другие данные)
    //Пересобираем строку
    $str = implode('\r\n', $file);
    file_put_contents($filename, $str);
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Раздел записей фиксирован?

    Или между ними есть какой-то разделитель?


    Если оба ответа "нет" - то никак. Более того вы даже прочитать назад по-отдельности записи не сможете.
     
  7. Sinsir

    Sinsir Активный пользователь

    С нами с:
    27 май 2009
    Сообщения:
    60
    Симпатии:
    0
    Это уже плохо...
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Это обычно.

    Тебе нужен один из вариантов
    1. фиксированный размер записи
    2. разделитель между записями
    3. Где-то отдельно хранить информацию о месте записи
     
  9. Sinsir

    Sinsir Активный пользователь

    С нами с:
    27 май 2009
    Сообщения:
    60
    Симпатии:
    0
    меня бы устроил фиксированый размер строки в 9 символов. но как это можна реализовать?
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Например, дополняй данные пробелами до длины 9 символов.

    PHP:
    1. <?php
    2.  
    3. define ('RECORD_SIZE', 9);
    4. $fp = fopen('somefile.txt', 'a+');
    5.  
    6. for ($i=1; $i<10; $i++) {
    7.     $a = sprintf('%' . RECORD_SIZE . 's', $i);
    8.     fwrite($fp, $a);
    9. }
    10.  
    11. // читаем 6й элемент
    12. fseek($fp, (6 - 1) * RECORD_SIZE);
    13. $res = fread($fp, RECORD_SIZE);
    14. var_dump($res);
    15. fclose($fp);
    16.  
     
  11. Sinsir

    Sinsir Активный пользователь

    С нами с:
    27 май 2009
    Сообщения:
    60
    Симпатии:
    0
    $a = sprintf('%' . RECORD_SIZE . 's', $i);
    Если Вас незатруднит, немогли бы Вы пояснить детальнее эту строку?
    Я пока еще неучил такие выражения.
    И можно ли избавитса от пробелов между символами?