PHP - цикл while (!feof()) не выводит/показывает все

Я пытаюсь прочитать (и повторить) все в .txt-файле.

Это мой код:

$handle = @fopen("item_sets.txt", "r");

while (!feof($handle))
{
    $buffer = fgets($handle, 4096);
    $trimmed = trim($buffer);
    echo $trimmed;
}

Это мой "item_sets.txt": http://pastebin.com/sxapZGuW

Но он не повторяет все (и меняет, сколько он показывает, в зависимости от того, сколько символов я повторяю после него). var_dump() показывает мне, что последняя строка никогда не распечатывается. Это выглядит так:

" string(45) ""[cu_well_tra. Но если я поставлю

echo "whateverthisisjustarandomstringwithseveralcharacters";,

мои последние выходные строки выглядят так:

" string(45) ""[cu_well_traveled_ak47]weapon_ak47" "1" " string(5) "} "

По сути, мой код не печатает/отображает все, что должен, или, по крайней мере, не показывает.

Заранее спасибо :)


person njoye    schedule 22.12.2015    source источник
comment
почему бы не использовать print file_get_contents() здесь?   -  person ob_start    schedule 23.12.2015
comment
@ob_start все еще не все печатает   -  person njoye    schedule 23.12.2015
comment
В вашем коде нет ничего плохого — он читает все строки и выводит их. За исключением trim "съедает" все маркеры end of line, поэтому при отображении вам нужно использовать PHP_EOL. я, э. echo $trimmed, PHP_EOL;. В противном случае вы получите одну длинную строку вывода.   -  person Ryan Vincent    schedule 23.12.2015


Ответы (1)


Это потому, что ваш тест на EOF выполняется до того, как вы выведете свое последнее чтение

Попробуйте это с тестом на EOF как часть процесса чтения

<?php
$line_count = 0;

$handle = fopen("item_sets.txt", "r");

if ($handle) {

    while (($buffer = fgets($handle, 4096)) !== false) {
        $trimmed = trim($buffer);
        echo $trimmed;
        $line_count++;
    }
} else {
    echo 'Unexpected error opening file';
}
fclose($handle);

echo PHP_EOL.PHP_EOL.PHP_EOL.'Lines read from file = ' . $line_count;
?>

Также я удалил @ перед fopen, это плохая практика игнорировать ошибки, и гораздо лучше искать их и справляться с ними.

Я скопировал ваши данные в файл с именем tst.txt и запустил именно этот код.

<?php
$handle = fopen('tst.txt', 'r');

if ($handle) {

    while (($buffer = fgets($handle, 4096)) !== false) {
        $trimmed = trim($buffer);
        echo $trimmed;
    }
} else {
    echo 'Unexpected error opening file';
}
fclose($handle);

И он сгенерировал этот вывод (здесь показана лишь небольшая часть)

"item_sets"{"set_community_3"{"name"            "#CSGO_set_community_3""set_description"                "#CSGO_set_community_3_desc""is_collection"

И последний вывод

[aa_fade_revolver]weapon_revolver"          "1"

Какая последняя запись в файле данных

person RiggsFolly    schedule 22.12.2015
comment
Это также не печатает все: / Может ли это быть просто проблемой вывода? - person njoye; 23.12.2015
comment
Добавьте строку отладки, чтобы увидеть, действительно ли она вообще обходит этот цикл. - person RiggsFolly; 23.12.2015
comment
Ну ... теперь он больше ничего не показывает, он буквально даже не показывает мой html-документ, который у меня был, кроме панели навигации. - person njoye; 23.12.2015
comment
И вы искали в своем php error log какие-либо подсказки. Также помните, что я могу видеть только то, что вы мне показали, я не вижу html, поэтому я рассматривал это как отдельный фрагмент кода. - person RiggsFolly; 23.12.2015
comment
Последний журнал журнала ошибок был, когда я пытался распечатать его с помощью file_get_contents() - person njoye; 23.12.2015
comment
Что происходит, когда вы удаляете строку отладки - person RiggsFolly; 23.12.2015
comment
Это показывает мне, что $trimmed это 1, и это много раз ... Мне интересно, я делал это раньше с другим файлом, и там все работало нормально. - person njoye; 23.12.2015
comment
Этот файл выглядит ПОЧТИ как строка JSON. Это то, чем он должен быть? - person RiggsFolly; 23.12.2015
comment
Но... какая разница, если я просто читаю строку за строкой и сохраняю ее как строку? На самом деле это не должно влиять (по крайней мере, я так думаю). - person njoye; 23.12.2015
comment
Хммм, я только что попробовал, и да, это дает много 11111111 дай мне поиграть минутку - person RiggsFolly; 23.12.2015
comment
Хаааааа. См. поправку. Все из-за набора кронштейнов. Здесь уже поздно, извините, что пропустил это полностью - person RiggsFolly; 23.12.2015
comment
Итак, у вас есть решение? :) - person njoye; 23.12.2015
comment
да. Посмотрите на лишние скобки в строке while (($buffer = fgets($handle, 4096)) !== false) { - person RiggsFolly; 23.12.2015
comment
И это распечатывает все в вашем коде? Не могли бы вы опубликовать полный код, потому что он все еще не работает для меня... - person njoye; 23.12.2015
comment
Я не знаю, что не так, я даже поместил код и текст текстового файла в другой файл и попробовал, но все равно не все распечатывается... - person njoye; 23.12.2015
comment
Давайте продолжим обсуждение в чате. - person RiggsFolly; 23.12.2015