2015-02-16 2 views
-3

Я write строка data в текст file внутри для цикла:Как удалить строку из текстового файла?

$vokatra_res = fopen(RP_MAIN . "vokatra.res","a+"); 
$p = $vokatra->lireTout(array(), array("type_id")); // getting rows from database 
for($l=0 ; $l<$p['cnt'] ; $l++) { 
    $str = $p[$l]['produit_code'] . '|' . $p[$l]['type_id'] . '|' . $p[$l]['produit_lib'] . "\r\n"; 
    fwrite($vokatra_res, $str); 
} 
fclose($vokatra_res); 

В результате есть пустая строка в конце файла. Итак, как удалить эту пустую строку перед закрытием файла?

+1

Если вы не имеете пустую строку в конце, ваши данные будут все в один большой комок, как это добавляется к файлу. Покажите нам пример проблемы. Это определенно '. «\ r \ n» «делает это. –

+0

Возможно, «\ r \ n» создает пустую последнюю строку? Я лично вставлял бы if внутри цикла for, проверяя: 'if ($ l == ($ p ['cnt'] - 1)) {// печатать без" \ r \ n ", потому что это последняя строка} '. – briosheje

ответ

2

Вы можете избежать написания дополнительный символ новой строки, добавив его ко всем строкам, кроме последнего:

$newline = ($l < $p['cnt'] - 1) ? "\r\n" : ""; 

$str = $p[$l]['produit_code'] . '|' . $p[$l]['type_id'] . '|' . $p[$l]['produit_lib'] . $newline; 

Этот код заполнит $newline переменную только если цикл не обрабатывает последнюю строку данных. Содержимое $newline (независимо от того, содержит ли оно «\ r \ n» или нет) конкатенируется до конца каждой строки.

Дополнительный: Тройной оператор может быть трудно понять; Рассмотрим этот код, который производит один и тот же результат:

if ($l < $p['cnt'] - 1) { 
    $newline = "\r\n"; 
else { 
    $newline = ""; 
} 
+0

Я знаю тернарный операнд! – pheromix

+0

Я ожидал, что ты это сделаешь. Однако я добавил дополнительную информацию для будущих читателей этого вопроса, которые могут быть менее искусны, чем вы. –

0

Ifyou не нужно проверять в каждой итерации, вы можете сделать так:

$vokatra_res = fopen(RP_MAIN . "vokatra.res","a+"); 
$p = $vokatra->lireTout(array(), array("type_id")); // getting rows from database 
for($l=0 ; $l<$p['cnt']-1 ; $l++) { 
    $str = $p[$l]['produit_code'] . '|' . $p[$l]['type_id'] . '|' . $p[$l]['produit_lib'] . "\r\n"; 
    fwrite($vokatra_res, $str); 
} 
$str = $p[$l]['produit_code'] . '|' . $p[$l]['type_id'] . '|' . $p[$l]['produit_lib']; 
fwrite($vokatra_res, $str); 
fclose($vokatra_res); 

Вы покидаете последнюю строку вне для цикла. и вы не ставите на него «\ r \ n».

В противном случае:

$vokatra_res = fopen(RP_MAIN . "vokatra.res","a+"); 
$p = $vokatra->lireTout(array(), array("type_id")); // getting rows from database 
for($l=0 ; $l<$p['cnt']; $l++) { 
    $str = $p[$l]['produit_code'] . '|' . $p[$l]['type_id'] . '|' . $p[$l]['produit_lib']; 
    if ($l < $p['cnt'] - 1) { 
     $str .= '\r\n', 
    } 
    fwrite($vokatra_res, $str); 
} 
fclose($vokatra_res); 

Разве это не очень важно, как проверить последнюю строку во время цикла. Важно, чтобы избежать написания к двойной в файл как:

for($l=0 ; $l<$p['cnt']; $l++) { 
    $str = $p[$l]['produit_code'] . '|' . $p[$l]['type_id'] . '|' . $p[$l]['produit_lib']; 
    fwrite($vokatra_res, $str); 
    if ($l < $p['cnt'] - 1) { 
     fwrite($vokatra_res, '\r\n'); 
    } 
} 
Смежные вопросы