Функція fread(), як визначено в стандарті C, підрозділ 7.21. 8.1 [ISO/IEC 9899:2011], не завершує нульовим значенням послідовність прочитаних символів. чий розмір задано size , з потоку, на який вказує stream .
Усі рядки символів закінчуються нульовим символом. Нульовий символ вказує на кінець рядка. Такі рядки називаються рядками з нульовим закінченням. Нульовий термінатор багатобайтового рядка складається з одного байта, значення якого дорівнює 0.
s2 — це C-рядок, створений масивом символів, ініціалізованим рядковим літералом. Компілятор автоматично додає нульовий термінатор у кінці літералу та копіює його в s2 . s3 — символьний покажчик, ініціалізований для вказівки на s2 (s2 — ім’я масиву без дужок, отже, це адреса).
Повернене значення. Функція fread() повертає кількість успішно прочитаних повних елементів, який може бути меншим за лічильник, якщо сталася помилка, або якщо кінець файлу досягнуто до досягнення лічильника. Якщо розмір або кількість дорівнює 0, функція fread() повертає нуль, а вміст масиву та стан потоку залишаються незмінними…
Повернене значення Якщо розмір або кількість дорівнює 0, fread повертає 0, а вміст буфера не змінюється. Якщо потік або буфер є нульовим покажчиком, fread викликає обробник недійсних параметрів, як описано в розділі Перевірка параметрів. Якщо виконання дозволено продовжувати, ця функція встановлює для errno значення EINVAL і повертає 0.
Ваш код передбачає, що fread повертає значення прочитаного байта, яке може бути EOF. Це не так. Він повертає кількість прочитаних "блоків".