Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
100 / 79 / 9
Регистрация: 03.08.2014
Сообщений: 447

Чтение из файла, странное поведение fread

27.08.2014, 21:02. Показов 2877. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с непонятным поведением функции fread.
Задача - считать побайтно текстовый файл в формате utf-8. Вот какой использую код:
PHP
1
2
3
4
5
6
7
8
    $handle = fopen($filename, "rb"); 
    $i = 0;
    while ($data = fread($handle, 1))
    {
        $i++;
        echo $i." : ".$data."\n"; 
    }
    fclose($handle);
Работает отлично, если не встречается 0 (обычный ноль), чтение тут же прерывается, хотя это далеко не конец файла.
Не пойму в чем проблема?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.08.2014, 21:02
Ответы с готовыми решениями:

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

чтение данных из открытого файла (fread)
if (_wfopen_s(&f, file_name, L"rtS, ccs=UTF-8") == 0){ fread((void*)rf, sizeof(wchar_t), 512, f); ...

Бинарное чтение из файла с пoмощью функции fread()
Подскажите, пожалуйста, почему feof() может возвращать конец файла далеко до его реального конца? Конец проверяется из обозревателя файлов...

5
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
 Аватар для Tatikoma
260 / 224 / 109
Регистрация: 07.07.2014
Сообщений: 965
27.08.2014, 21:32
Лучший ответ Сообщение было отмечено Alexvp как решение

Решение

Цитата Сообщение от Alexvp Посмотреть сообщение
while ($data = fread($handle, 1))
Давайте на секунду остановимся и подумаем, что делает этот код (конкретно в случае когда читается байт "0").

1. Считать 1 байт из файла, получаем "0".
2. Присваиваем переменной $data значение "0".
3. Проверяем условие цикла, т.к. явно условие не задано - используется результат последней операции, операция присвоения возвращает присваиваемое значение - т.е. "0".
4. Нам нужно установить истинно (true) или ложно (false) условие, для этого значение "0" преобразуется в тип boolean, согласно правилам преобразования типов. Строка со значением "0" - всегда ложная, следовательно цикл нужно завершить.

Соответственно правильный код условия должен запрещать преобразование типов, во избежание таких ситуаций, т.е. например так:
PHP
1
while ($data = fread($handle, 1) !== false)
1
 Аватар для Voka
207 / 199 / 110
Регистрация: 27.12.2010
Сообщений: 819
Записей в блоге: 1
27.08.2014, 21:33
а если просто воспользоваться функцией file() ?
PHP
1
2
$myfile=file($filename);
print_r($myfile);
0
27.08.2014, 21:37

Не по теме:

Voka, каким образом это поможет решить задачу побайтного чтения? - Не построчного.

0
100 / 79 / 9
Регистрация: 03.08.2014
Сообщений: 447
27.08.2014, 22:45  [ТС]
Логика в ваших словах верная, но на практике while ушел в бесконечный цикл, прерванный 30 секундным пределом выполнения скрипта. Получается, что добавленным условием мы отсекаем определение конца файла?

Добавлено через 6 минут
Сделал так:
PHP
1
2
3
4
5
6
        while (!feof($handle))
        {
            $i++;
            $data = fread($handle, 1); 
            echo $i." - ".$data."|";
        }
0
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
 Аватар для Tatikoma
260 / 224 / 109
Регистрация: 07.07.2014
Сообщений: 965
28.08.2014, 16:45
Цитата Сообщение от Alexvp Посмотреть сообщение
Логика в ваших словах верная, но на практике while ушел в бесконечный цикл, прерванный 30 секундным пределом выполнения скрипта. Получается, что добавленным условием мы отсекаем определение конца файла?
Моя ошибка. В случае конца файла, - fread возвращает пустую строку (а она не идентична false, следовательно цикл бесконечен). Можно проверять на пустую строку, но код который вы написали - религиозно более верный. Использовать feof() - корректно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.08.2014, 16:45
Помогаю со студенческими работами здесь

Запись / чтение из файла через fwrite/fread
Итак здравствуйте) объясниет пожалуйста что за баг))) простенькая вроде программа. записываем данные в файл а затем достаем эти...

Странное поведение iis при заливке файла
Мож кто сталкивался... Обрабатываю multipart форму через binaryRead, все нормально. Решил ввести ограничение на максимальный объем...

Запись и чтение из бинарного файла, объяснить поведение программы
Добрый день! Подскажите, есть код #include <fstream> #include <iostream> using namespace std; int main() {

Чтение fread по адресу
у меня есть адреса элементов структуры записанных в бинарник, мне надо считать эту структуру... как мне использовать эти адреса в fread? ну...

fwrite\fread: чтение и запись в бинарные файлы
Добрый день. Пытаюсь разобратся с чтением и записью в бинарные файлы.. в общем обрисую в краце проблему, записываю класс. class tPoint ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru