Суть - две программы - одна передает файл, другая принимает через сокеты,Com, Lpt, USB порты. USB не сделал еще, не могу найти информацию про них.
В чем проблема - при передаче определенных файлов через сокеты, функция fread заканчивает чтение файла не дойдя до конца файла ( на 89 кбайте). Такое случается не на всех файлах, и я не пойму в чем дело.
Вот тут http://slil.ru/26523213 проекты Visual Studio 2005. А тут http://slil.ru/26523227 только исходники.В папке FileTransfer находятся тестовые файлы для передачи, все файлы кроме test1.txt передаются правильно.
И если кто-то может протестировать на соединении через Com или Lpt, пожалуйста напишите. И если кто-то значет что-то про USB - тоже
Помогите отловить баг, пожалуйста.
10 января 2009 в 12:01
do {
n_read = fread(&content,sizeof(char), sizeof(content), f);
act_size = n_read;
WriteFile(hPort,&act_size,sizeof(act_size),&dw,&ov);
WriteFile(hPort,content,sizeof(content),&dw,&ov);
}
while (n_read == sizeof(content));
Это неправильно. fread не обязан возвращать столько байтов сколько ты просишь, он в принципе может тебе хоть по одному байту файл отдавать, даже если ты просишь блоками по 64к. Указываемый размер – это твое "пожелание" системе.
Условие завершения должно быть другое – n_read == 0 или feof(f) || ferror(f).
10 января 2009 в 12:01
не, если возвращает меньше, то цикл прекращается. Дело в том, что возвращает меньше, когда еще несколько байт файла осталось – и не во всех файлах
10 января 2009 в 12:01
Вот я и говорю, что оно *может* возвращать меньше, даже когда еще осталось содержимое в файле, *поэтому* проверять конец файла надо не по n_read == sizeof(content), а по n_read == 0.
10 января 2009 в 12:02
Хм. Хотя нет, вроде не может… Ну, в общем, попробуй все-таки использовать feof/ferror – может, и заработает.
10 января 2009 в 12:02
MSDN – fread returns the number of full items actually read, which may be less than count if an error occurs or if the end of the file is encountered before reaching count.
То есть происходит ошибка или файл закончился, но файл не закончился. Ошибки не должно быть. В других случаях функция не должна возвращать меньше.
Я попробовал while (!(feof(f) || ferror(f))); – тот же эффект, сейчас попробую на ноль
10 января 2009 в 12:02
нет, не работает и при проверке на ноль, чувствую я где-то жестко туплю
10 января 2009 в 12:03
А как ты определяешь, что оказываются прочитаны не все байты файла? Самый надежный способ – просуммировать возвращенные fread'ом значения.
10 января 2009 в 12:03
всё я нашел его
нужно открывать файлы с атрибутом на бинарное чтение ("rb" and "wb"), а то будет на любом нуле прекращаться. Вообще забыл про это. Спасибо, а то еще б долго мучился.
10 января 2009 в 12:03
Жека jkff Кирпичев, а у тебя нет случайно COM или LPT кабеля?
10 января 2009 в 12:04
Увы, нету.