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

Статус
В этой теме нельзя размещать новые ответы.

LEXAlForpostl

Мой дом здесь!
Регистрация
21 Май 2008
Сообщения
766
Реакции
228
Здравствуйте.
Подскажите пожалуйста, как из файла первые 10 строк записать в массив и затем их удалить из файла.
 
в этой теме обсуждается аналогичная задача:

Скрытое содержимое доступно для зарегистрированных пользователей!
 
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);
 
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);
Ужас!) Зачем 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 строк из файла
 
Ужас!) Зачем 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 строк из файла
изящно! никогда не пробовал file_put_contents для записи
 
А как быть с большими файлами? тоже их целиком в память загружать?
 
А как быть с большими файлами? тоже их целиком в память загружать?
читать в цикле через feof() и fgets(). TC о размере файла ничего не упомянул. Если тебя интересует реализация чтения больших файлов, создавай отдельный топик.
 
Быстрее всего и без всяких извращений сделать так:
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');
?>

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

Способ с массивами будет работать только на файлах размером не больше нескольких мегобайт.
 
Быстрее всего и без всяких извращений сделать так...
еще на долю процента быстрее будет использовать преинкремент вместо постинкремента, а также не помешает использовать директиву auto_detect_line_endingsчтобы определить способ завершения строк для Unix, MS-Dos или Macintosh)) по-моему все что не оговорено ТС - лишнее, а так тему раздувать можно до бесконечности
 
еще на долю процента быстрее будет использовать преинкремент вместо постинкремента

Это пхп, а не с++. Здесь это не существенно.

а также не помешает использовать директиву auto_detect_line_endings чтобы определить способ завершения строк для Unix, MS-Dos или Macintosh

Она используется только для маков и у нее есть небольшая нагрузка.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху