Доброго времени суток. Столкнулся с совершенно безумной ситуацией, может, кто-нибудь подскажет, хотя бы в какую сторону можно попробовать копать.
Некоторый проект считывает файл с помощью fopen()/fread(). На одном из компьютеров (пока удалось воспроизвести проблему только на нём) файл считается более коротким, чем он есть на самом деле, из-за чего считывание не удаётся.
Минимальный код, при котором ошибка воспроизводится, выглядит так:
Здесь links_count -- заранее известный размер считываемой области. После работы fread() получается, что rlc != links_count.
Общий размер считываемого файла -- 6-7 мегабайт. Проблемный компьютер -- слабый по нынешним понятиям, но не настолько, чтобы не считать 6 мегов (работает под управлением WinXP).
Re: Непонятные ошибки при чтении файла функциями stdio
_>Некоторый проект считывает файл с помощью fopen()/fread(). На одном из компьютеров (пока удалось воспроизвести проблему только на нём) файл считается более коротким, чем он есть на самом деле, из-за чего считывание не удаётся.
_>Минимальный код, при котором ошибка воспроизводится, выглядит так:
_>
_>fp = fopen(fname, "r");
_>
Попробуйте явно указать текстовый/двоичный файл
По умолчанию файл откроется в текстовом режиме, если не изменена переменная _fmode.
Именно в текстовом режиме всякие 0xd, 0xa не считаются за символы и пропускаются
Re: Непонятные ошибки при чтении файла функциями stdio
MS>Попробуйте явно указать текстовый/двоичный файл MS>По умолчанию файл откроется в текстовом режиме, если не изменена переменная _fmode. MS>Именно в текстовом режиме всякие 0xd, 0xa не считаются за символы и пропускаются
Увы, уже пробовал. Не помогает (да и это не объясняет, почему на разных компьютерах разные результаты).
Re[2]: Непонятные ошибки при чтении файла функциями stdio
_>На проблемном компьютере printf() печатает другой размер файла (меньший).
Попробуй после каждого чтения заглядывать в feof(), ferror(). Если что-то будет, то сразу perror().
Чисто на удачу — попробуй подергать fflush(). Ну и бинарный режим тебе правильно посоветовали.
Обрывается всегда на одном и том же байте? А если другой файл подсунуть? Вообще от файла зависит? Приведи точные числа по размеру файла и тому, сколько раз зачитывается и что возвращается в последнем l.
Главное гармония ...
Re[2]: Непонятные ошибки при чтении файла функциями stdio
_>>На проблемном компьютере printf() печатает другой размер файла (меньший). AF>насколько меньший? может 0?
AF>Может какая ошибка возникает при чтении? проверяли?
Не ноль Обрывается на операции 1693753, а надо 1693805.
Ошибку тоже проверял, ferror() == 0.
Нда, сдаётся мне, что не в файле проблема, а какие-то кошмары с залезанием переменных друг на друга или что-нибудь в таком роде, потому что безумие какое-то
Re[2]: Непонятные ошибки при чтении файла функциями stdio
M>Попробуй после каждого чтения заглядывать в feof(), ferror(). Если что-то будет, то сразу perror(). M>Чисто на удачу — попробуй подергать fflush(). Ну и бинарный режим тебе правильно посоветовали. M>Обрывается всегда на одном и том же байте? А если другой файл подсунуть? Вообще от файла зависит? Приведи точные числа по размеру файла и тому, сколько раз зачитывается и что возвращается в последнем l.
Да, идея хороша, но в сухом остатке то же: feof() == 1, ferror() == 0.
Обрывается всегда на одном и том же месте. Подсунуть другой файл не могу -- это что-то вроде базы данных (программа изначально не моя), и сходу создать другую базу вряд ли смогу
А чиста вполне обыкновенные: на нормальном компьютере 1693805 операций чтения до EOF, на том волшебном -- 1693753 операции.
Мне уже кажется, что автор намутил с динамическим выделением памяти. Может, буфера друг на друга налезают или ещё что-нибудь в этом роде. Потому что бред какой-то
Re: Непонятные ошибки при чтении файла функциями stdio
Здравствуйте, rg_software, Вы писали:
_>Некоторый проект считывает файл с помощью fopen()/fread(). На одном из компьютеров (пока удалось воспроизвести проблему только на нём) файл считается более коротким, чем он есть на самом деле, из-за чего считывание не удаётся.
На всякий случай прогони chkdsk на этом проблемном компьютере. Может, что-то с файлом. То, что в каталоге одинаковые длины — еще не аргумент. Какая ФС — NTFS или FAT ?
With best regards
Pavel Dvorkin
Re[3]: Непонятные ошибки при чтении файла функциями stdio
_>Да, идея хороша, но в сухом остатке то же: feof() == 1, ferror() == 0. _>Обрывается всегда на одном и том же месте. Подсунуть другой файл не могу -- это что-то вроде базы данных (программа изначально не моя), и сходу создать другую базу вряд ли смогу
Гм. А не устроила ли эта база данных нечто вроде LockFile на этом месте ? Можно СУБД отключить и попробовать ?
И еще одна идея. Скопируй этот файл на проблемном компьютере в другое место и попробуй поработать с копией.
With best regards
Pavel Dvorkin
Re[3]: Непонятные ошибки при чтении файла функциями stdio
Здравствуйте, rg_software, Вы писали:
_>Ошибку тоже проверял, ferror() == 0.
А errno тоже 0?
_>Нда, сдаётся мне, что не в файле проблема
Попробуй прочитать файл функциями API ОС или прочитать его какой-нибудь другой программой.
Re: Непонятные ошибки при чтении файла функциями stdio
Здравствуйте, rg_software, Вы писали:
_>Общий размер считываемого файла -- 6-7 мегабайт. Проблемный компьютер -- слабый по нынешним понятиям, но не настолько, чтобы не считать 6 мегов (работает под управлением WinXP).
Возможно изменение этих переменных или работа с файлом в другом потоке?
Re: Непонятные ошибки при чтении файла функциями stdio
_>На проблемном компьютере printf() печатает другой размер файла (меньший).
Всем огромное спасибо -- проблему всё-таки удалось разрешить с помощью fopen(file, "rb"). Раньше я сказал, что это не так, но ошибся: просто ещё далее в коде возникла аналогичная сложность. Однако странный осадок остался -- как может быть так, что fopen(file, "r") работает по-разному на двух WinXP-машинах, хотя бы в теории? (Для повышения общей образованности спрашиваю).