Непонятные ошибки при чтении файла функциями stdio
От: rg_software  
Дата: 15.06.09 21:54
Оценка:
Доброго времени суток. Столкнулся с совершенно безумной ситуацией, может, кто-нибудь подскажет, хотя бы в какую сторону можно попробовать копать.

Некоторый проект считывает файл с помощью fopen()/fread(). На одном из компьютеров (пока удалось воспроизвести проблему только на нём) файл считается более коротким, чем он есть на самом деле, из-за чего считывание не удаётся.

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


fp = fopen(fname, "r");
unsigned count = 0, temp;
while(1 == fread(&temp, sizeof(u_int32_t), 1, fp))
    ++count;
fclose(fp); 
printf("fsize: %u\n", count);


На проблемном компьютере printf() печатает другой размер файла (меньший).

Изначально проблема появилась в такой строке:

unsigned rlc = fread(ret_data->ptr_links, sizeof(u_int32_t), links_count, fp);


Здесь links_count -- заранее известный размер считываемой области. После работы fread() получается, что rlc != links_count.

Общий размер считываемого файла -- 6-7 мегабайт. Проблемный компьютер -- слабый по нынешним понятиям, но не настолько, чтобы не считать 6 мегов (работает под управлением WinXP).
Re: Непонятные ошибки при чтении файла функциями stdio
От: MShura  
Дата: 15.06.09 23:02
Оценка:
_>Некоторый проект считывает файл с помощью fopen()/fread(). На одном из компьютеров (пока удалось воспроизвести проблему только на нём) файл считается более коротким, чем он есть на самом деле, из-за чего считывание не удаётся.

_>Минимальный код, при котором ошибка воспроизводится, выглядит так:



_>
_>fp = fopen(fname, "r");
_>


Попробуйте явно указать текстовый/двоичный файл
По умолчанию файл откроется в текстовом режиме, если не изменена переменная _fmode.
Именно в текстовом режиме всякие 0xd, 0xa не считаются за символы и пропускаются
Re: Непонятные ошибки при чтении файла функциями stdio
От: Sergey Chadov Россия  
Дата: 16.06.09 04:34
Оценка:
Здравствуйте, rg_software, Вы писали:

_>
_>fp = fopen(fname, "r");
_>unsigned count = 0, temp;
_>while(1 == fread(&temp, sizeof(u_int32_t), 1, fp))
_>    ++count;
_>fclose(fp); 
_>printf("fsize: %u\n", count);
_>


fopen(fname, "rb");
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: Непонятные ошибки при чтении файла функциями stdio
От: rg_software  
Дата: 16.06.09 12:04
Оценка:
MS>Попробуйте явно указать текстовый/двоичный файл
MS>По умолчанию файл откроется в текстовом режиме, если не изменена переменная _fmode.
MS>Именно в текстовом режиме всякие 0xd, 0xa не считаются за символы и пропускаются

Увы, уже пробовал. Не помогает (да и это не объясняет, почему на разных компьютерах разные результаты).
Re[2]: Непонятные ошибки при чтении файла функциями stdio
От: rg_software  
Дата: 16.06.09 12:04
Оценка:
SC>fopen(fname, "rb");

Пробовал... Даже если так, на разных компьютерах должен быть одинаковый результат.
Re: Непонятные ошибки при чтении файла функциями stdio
От: Alexey Frolov Беларусь  
Дата: 16.06.09 13:15
Оценка: +1
Здравствуйте, rg_software, Вы писали:

_>На проблемном компьютере printf() печатает другой размер файла (меньший).

насколько меньший? может 0?

Может какая ошибка возникает при чтении? проверяли?
Re: Непонятные ошибки при чтении файла функциями stdio
От: Mazay Россия  
Дата: 16.06.09 14:16
Оценка:
Здравствуйте, rg_software, Вы писали:

_>Минимальный код, при котором ошибка воспроизводится, выглядит так:


_>
_>fp = fopen(fname, "r");
_>unsigned count = 0, temp;
_>while(1 == fread(&temp, sizeof(u_int32_t), 1, fp))
_>    ++count;
_>fclose(fp); 
_>printf("fsize: %u\n", count);
_>


_>На проблемном компьютере printf() печатает другой размер файла (меньший).


Попробуй после каждого чтения заглядывать в feof(), ferror(). Если что-то будет, то сразу perror().
Чисто на удачу — попробуй подергать fflush(). Ну и бинарный режим тебе правильно посоветовали.
Обрывается всегда на одном и том же байте? А если другой файл подсунуть? Вообще от файла зависит? Приведи точные числа по размеру файла и тому, сколько раз зачитывается и что возвращается в последнем l.
Главное гармония ...
Re[2]: Непонятные ошибки при чтении файла функциями stdio
От: rg_software  
Дата: 16.06.09 16:42
Оценка:
_>>На проблемном компьютере printf() печатает другой размер файла (меньший).
AF>насколько меньший? может 0?

AF>Может какая ошибка возникает при чтении? проверяли?


Не ноль Обрывается на операции 1693753, а надо 1693805.
Ошибку тоже проверял, ferror() == 0.

Нда, сдаётся мне, что не в файле проблема, а какие-то кошмары с залезанием переменных друг на друга или что-нибудь в таком роде, потому что безумие какое-то
Re[2]: Непонятные ошибки при чтении файла функциями stdio
От: rg_software  
Дата: 16.06.09 16:45
Оценка:
M>Попробуй после каждого чтения заглядывать в feof(), ferror(). Если что-то будет, то сразу perror().
M>Чисто на удачу — попробуй подергать fflush(). Ну и бинарный режим тебе правильно посоветовали.
M>Обрывается всегда на одном и том же байте? А если другой файл подсунуть? Вообще от файла зависит? Приведи точные числа по размеру файла и тому, сколько раз зачитывается и что возвращается в последнем l.

Да, идея хороша, но в сухом остатке то же: feof() == 1, ferror() == 0.
Обрывается всегда на одном и том же месте. Подсунуть другой файл не могу -- это что-то вроде базы данных (программа изначально не моя), и сходу создать другую базу вряд ли смогу

А чиста вполне обыкновенные: на нормальном компьютере 1693805 операций чтения до EOF, на том волшебном -- 1693753 операции.

Мне уже кажется, что автор намутил с динамическим выделением памяти. Может, буфера друг на друга налезают или ещё что-нибудь в этом роде. Потому что бред какой-то
Re: Непонятные ошибки при чтении файла функциями stdio
От: Pavel Dvorkin Россия  
Дата: 17.06.09 05:57
Оценка:
Здравствуйте, rg_software, Вы писали:

_>Некоторый проект считывает файл с помощью fopen()/fread(). На одном из компьютеров (пока удалось воспроизвести проблему только на нём) файл считается более коротким, чем он есть на самом деле, из-за чего считывание не удаётся.


На всякий случай прогони chkdsk на этом проблемном компьютере. Может, что-то с файлом. То, что в каталоге одинаковые длины — еще не аргумент. Какая ФС — NTFS или FAT ?
With best regards
Pavel Dvorkin
Re[3]: Непонятные ошибки при чтении файла функциями stdio
От: Pavel Dvorkin Россия  
Дата: 17.06.09 06:00
Оценка:
Здравствуйте, rg_software, Вы писали:


_>Да, идея хороша, но в сухом остатке то же: feof() == 1, ferror() == 0.

_>Обрывается всегда на одном и том же месте. Подсунуть другой файл не могу -- это что-то вроде базы данных (программа изначально не моя), и сходу создать другую базу вряд ли смогу

Гм. А не устроила ли эта база данных нечто вроде LockFile на этом месте ? Можно СУБД отключить и попробовать ?

И еще одна идея. Скопируй этот файл на проблемном компьютере в другое место и попробуй поработать с копией.
With best regards
Pavel Dvorkin
Re[3]: Непонятные ошибки при чтении файла функциями stdio
От: AleksandrN Россия  
Дата: 18.06.09 20:27
Оценка:
Здравствуйте, rg_software, Вы писали:

_>Ошибку тоже проверял, ferror() == 0.

А errno тоже 0?

_>Нда, сдаётся мне, что не в файле проблема

Попробуй прочитать файл функциями API ОС или прочитать его какой-нибудь другой программой.
Re: Непонятные ошибки при чтении файла функциями stdio
От: AleksandrN Россия  
Дата: 18.06.09 20:32
Оценка:
Здравствуйте, rg_software, Вы писали:

_>Общий размер считываемого файла -- 6-7 мегабайт. Проблемный компьютер -- слабый по нынешним понятиям, но не настолько, чтобы не считать 6 мегов (работает под управлением WinXP).


Возможно изменение этих переменных или работа с файлом в другом потоке?
Re: Непонятные ошибки при чтении файла функциями stdio
От: rg_software  
Дата: 20.06.09 08:09
Оценка:
_>На проблемном компьютере printf() печатает другой размер файла (меньший).

Всем огромное спасибо -- проблему всё-таки удалось разрешить с помощью fopen(file, "rb"). Раньше я сказал, что это не так, но ошибся: просто ещё далее в коде возникла аналогичная сложность. Однако странный осадок остался -- как может быть так, что fopen(file, "r") работает по-разному на двух WinXP-машинах, хотя бы в теории? (Для повышения общей образованности спрашиваю).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.