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

Тема в разделе "PHP", создана пользователем LEXAlForpostl, 31 окт 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    739
    Симпатии:
    226
    Здравствуйте.
    Подскажите пожалуйста, как из файла первые 10 строк записать в массив и затем их удалить из файла.
     
  2. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
  3. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    PHP:
        $mails=file("mails.txt");

        for (
    $i 0$i<10; ++$i) {
            
    $mail[] = $mails[$i];
        }
            
        
    $file=fopen("mails.txt","w");
        for (
    $i 10$i<count($mails); ++$i) {
            
    fputs($file,$mails[$i]); 
        }
        
    fclose($file);
     
  4. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Ужас!) Зачем 2 раза открывать 1 и тот же файл? и циклы тут не нужна. Задача решается в 4 строки кода:
    PHP:
    $file file("mails.txt");
    $slice array_splice($file,0,10);
    $data implode("",$file);
    file_put_contents("mails.txt",$data);
    массив $slice будет содержать первые 10 строк из файла
     
  5. informix

    informix Писатель

    Регистр.:
    3 апр 2008
    Сообщения:
    4
    Симпатии:
    1
    изящно! никогда не пробовал file_put_contents для записи
     
  6. Kloster

    Kloster

    Регистр.:
    22 июн 2009
    Сообщения:
    216
    Симпатии:
    12
    А как быть с большими файлами? тоже их целиком в память загружать?
     
  7. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    читать в цикле через feof() и fgets(). TC о размере файла ничего не упомянул. Если тебя интересует реализация чтения больших файлов, создавай отдельный топик.
     
  8. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    Быстрее всего и без всяких извращений сделать так:
    PHP:
    <?php 
    $file  
    fopen('test.txt''r');
    $file2 fopen('test2.txt''w');
    $i 0;
    while(!
    feof($file)) {
        
    $line fgets($file);
        if (
    $i >= 10) {
            
    fwrite($file2$line);
        }
        
    $i++;
    }
    fclose($file);
    fclose($file2);
    unlink('test.txt');
    rename('test2.txt''test.txt');
    ?>
    Т.е. открываем файл, читаем его построчно, сравниваем, записываем в другой файл ,потом старый файл удаляем и переименовываем. Будет работать даже гигобайтными файлами.

    Способ с массивами будет работать только на файлах размером не больше нескольких мегобайт.
     
  9. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    еще на долю процента быстрее будет использовать преинкремент вместо постинкремента, а также не помешает использовать директиву auto_detect_line_endingsчтобы определить способ завершения строк для Unix, MS-Dos или Macintosh)) по-моему все что не оговорено ТС - лишнее, а так тему раздувать можно до бесконечности
     
  10. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    Это пхп, а не с++. Здесь это не существенно.

    Она используется только для маков и у нее есть небольшая нагрузка.
     
Статус темы:
Закрыта.