Почему fgets и fopen не могут «открыть поток», за исключением последней строки файла?

Почему fgets и fopen не могут «открыть поток», за исключением последней строки входного файла?

Я пытаюсь прочитать файл деревьев каталогов и текстовых файлов и открыть каждый файл.

filelist.txt содержит:

a/1600/file.txt
b/1600/file.txt
c/1600/file.txt

Каталог:

c/1600/file.txt содержит текст directory c

Вывод в index.php таков:

Предупреждение: file_get_contents(a/1600/file.txt): не удалось открыть поток: Нет такого файла или каталога в /Users/joe/Sites/php/index.php в строке 9.

Предупреждение: file_get_contents(b/1600/file.txt): не удалось открыть поток: Нет такого файла или каталога в /Users/joe/Sites/php/index.php в строке 9.

каталог с

Почему выводится только содержимое c/1600/file.txt?

index.php (PHP 8.2):

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


if ($handle) {
    
    while (($line = fgets($handle)) !== false) {

        $eachfilecontents = file_get_contents($line, true);

        echo $eachfilecontents;

    }

    fclose($handle);
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я изменил ваш код, чтобы проверить файл, прежде чем перейти к следующему.

<?php
$handle = fopen("filelist.txt", "r");
if ($handle){
    while(($line = fgets($handle)) !== false) {
        $line = trim($line);    
        if (file_exists($line)){ 
            $eachfilecontents = file_get_contents($line);
            echo $eachfilecontents;
        }
        else{ echo "File not found: " . $line . "<br>"; }
    }    
    fclose($handle);
}    
?>

замените код файла index.php на этот, и он вернет вам данные из всех файлов.

этот код не имеет никакого смысла, поскольку он делает то же самое, что и код в OP: обрабатывает только последний файл

Your Common Sense 14.08.2024 09:12

Я запустил код с той же ситуацией, что и в вопросе. оно работает. это из-за file_get_contents($file, true). => здесь, если мы удалим «,true», это сработает, потому что нам не нужно включать необходимые пути к файлам.

yogeshdinodia 14.08.2024 10:54

это работает из-за обрезки, а не из-за «удаления истины». в то время как добавление этого «проверочного файла» не имеет никакого смысла. Полагаю, вы не смогли понять код, который вам дал ChatGPT.

Your Common Sense 14.08.2024 11:51
Ответ принят как подходящий

Соответствующая часть сообщения об ошибке — «Нет такого файла или каталога». Из документации fgets():

Чтение заканчивается, когда прочитано length - 1 байт или новая строка (которая включена в возвращаемое значение)

Если последняя строка работает, это потому, что в файле нет последней новой строки.

Вы можете, например. подстригите сами:

$eachfilecontents = file_get_contents(rtrim($line), true);

Кстати, я не понимаю, почему вы используете функцию file_get_contents() с флагом use_include_path, это звучит как ненужное бремя.

Спасибо! Я только изучаю PHP на примерах и ответах на SE. Использование false с use_include_path работает. Мой следующий шаг таков: файл file.txt на самом деле содержит HTML, и я хочу проанализировать один URL-адрес в каждом файле и вывести его; я бы использовал preg_match_all?

BlueDogRanch 14.08.2024 18:19

Спасибо! Я обнаружил DOM после того, как оставил вам комментарий; и это ответ на мой вопрос stackoverflow.com/questions/2180255/…

BlueDogRanch 14.08.2024 19:48

Другие вопросы по теме