У вас есть size
и count
аргументы вокруг неправильного пути в fread
.Если вы попытаетесь fread
один элемент размером 1 КБ, и в файле останется только пятнадцать байтов, вы получите ничего , и файл навсегда останется непрочитанным.То есть, пока ваши fwrite
вызовы не заполнят диск, , затем вы будете знать об этом.
Другими словами, вы никогда не увидите эти последние пятнадцать байтов.Это потому, что хотя fread
с радостью даст вам меньше элементов , чем вы просите, оно даст вам только целые элементы, а не частичные.
Что вам нужно сделать, так это попробоватьи прочитайте 1024 элемента размером один байт каждый (а не один элемент размером 1024 байта).
fread
также возвращает фактическое количество прочитанных элементов (что, как отмечено выше, можетбыть меньше, чем вы просили) и это что вы должны передать fwrite
(a) :
size_t bytCount;
while (! feof (fin)) {
bytCount = fread (block, 1, sizeof(block), fin);
fwrite (block, 1, bytCount, fout);
}
Вы увидите, что ятакже изменил магическое число 1024
на sizeof(block)
- это сведет к минимуму изменения исходного кода, необходимые при увеличении размера буфера.
(a) Если вы хотеличтобы быть действительно надежным, fwrite
также возвращает количество написанных элементов, которое может быть меньше, чем вы запрашивали.Идеальный код также проверил бы это условие.