Оно не в байтах возвращает, а в итемах. Видимо, у тебя этот hostname меньше чем 100 байт.
man fread:
On success, fread() and fwrite() return the number of items read or written. This number equals the number of bytes transferred only when size is 1. If an error occurs, or the end of the file is reached, the return value is a short item count (or zero).
fread читает кусками, размером <первый числовой аргумент> и количеством <второй числовой аргумент>. Возвращает число прочитанных полных кусков. Ты читаешь один кусок размером 100 байт.
У тебя тут не прочитано байт, а длина строки. Более того, нулевой байт оно не учитывает. Почему бы просто не использовать read(2)? Он как раз возвращает число прочитанных байт.
Я забыл полнулять, тогда бы было 0 если данные не прочитались и Nбайт равное прочитанному если почитались, имя хоста может сожержать пробел через экранирование? Вроде нет.
У меня нет предположений. Я просто предположил, что ТС использует fread как раз потому, что весь интернет заполонён воем про небезопасность функций stdlib без f спереди. Даже если они лучше всего подходят для задачи.
весь интернет заполонён воем про небезопасность функций stdlib без f спереди
У тебя какой-то странный интернет, видимо ты сидишь в какой-то соцсети и подписан там на идиотов, которые тебе это пишут. В нормальных местах такого быть не могло.
Хватит бредить и избавляйся от дрочения на комитеты. read() это нативный способ чтения файлов, а fread бажная обёртка над ним. Его может быть нет разве что в винде (и то не уверен), но помощь по проганию под винду тут не оказывается.
у тебя size = 100. ты прочитал, к примеру, 99 ну и соответственно получаешь 99/100. что для size_t = 0.
Как уже было сказано, ты перепутал местами 100 и 1. Ну и для ошибок и конца нужно использовать функции ferror и feof. len > 0 - это багокод, что ты и обнаручил.
плевок в лицо майнтейнерам libc.
Ссылки на конкретные баги
Он - bsd’шник. У них своя libc. Там есть вот такие приколы, которые могут быть не пофикшены добрых 15+ лет, пока кто-нибудь не скопирует фикс из другой *BSD . У него, как и у любого лонг-тайм bsd’шника PTSD.
Я не про реализацию а про спецификацию. API fread-а вынуждает городить вокруг него костыли, которые систематически провоцируют баги, и от ОС это не зависит.
Впрочем и то, что на ровном месте городятся какие-то обёртки (даже если бы она была одна - сам fread), это тоже почти баг.
Опять столкнулся со странной ошибкой этого самого fread. Вроде все хорошо делаю. Простой пример, читаем данные и перезаписываем их назад поблоков. Уходит в бесконечный цикл..
Корректно читает 1, 2, 3 мегабайты, а дальше начинается бред.
#define BLOCK_SIZE 1024*1024
int badread(const char* file_name)
{
FILE* f = NULL;
size_t dwWR = 0;
uint64_t pos = 0;
f = fopen(file_name, "r+b");
if (f != NULL)
{
uint8_t* lpBuf = malloc(BLOCK_SIZE);
memset(lpBuf, 0, BLOCK_SIZE);
do
{
dwWR = fread(lpBuf, sizeof(uint8_t), BLOCK_SIZE, f); //размер элемента, к-тво элементов
if (dwWR == 0) break;
pos = dwWR;
fseek(f, -pos, SEEK_CUR);
if ((fwrite(lpBuf, sizeof(uint8_t), dwWR, f)) != dwWR)
{
puts("fwrite");
break;
}
} while (!feof(f));
FREE(lpBuf);
fclose(f);
}
return 1;
}
Упс. Действительно - поторопился я, не стОит так делать.
Но эффект действительно интересный - проблемы начинаются на первом fwrite() после fseek() после того как в EOF упёрлись. И вылазит это на RHEL в том числе, так что отползти сославшись на «условно-васянскую» сборку libc не получится. Придётся ковырять дальше…