Здесь есть несколько проблем. Начнем с вопроса, касающегося вашего вопроса:
Во-первых, fileBuffer
содержит содержимое файла. Это нормально, за исключением того, что %s
printf()
ожидает C -строку, а не содержимое файла. Разница в том, что строка C заканчивается нулевым байтом \0
.
Тогда у вас есть предположение, что файл содержит только текст. Если файл двоичный и, в частности, если он где-то содержит нулевой байт, ваша печать не будет работать.
Как исправить обе проблемы: используйте fwrite()
, для которого нулевой байт не нужен: замените
printf("\n%s", fileBuffer);
на
fwrite("\n", sizeof("\n"), 1, STDOUT);
fwrite(fileBuffer, fileSize, 1, STDOUT);
Далее, есть предположение о размере файла. Если размер файла составляет 16 МБ, вы попытаетесь выделить в стеке 16 МБ памяти, что приведет к тому, что ваша программа будет cra sh.
Как исправить: либо подтвердите предположение (if (fileSize > SOMETHING) return;
, либо что-то подобное) или динамически выделять fileBuffer
с помощью malloc()
.
Далее, вы не обрабатываете ошибки из fread()
. Если это не удалось, fread()
вернет 0.
Как исправить: пуленепробиваемый способ - иметь al oop как:
while (!feof(file)) {
fread(fileBuffer, fileSize, 1, file);
}
НО, если ваш файл может быть большим, fread()
может читать только его часть, и вам нужно:
n = 0;
while (!feof(file)) {
r = fread(fileBuffer + n, 1, fileSize, file);
n += r;
}
Обратите внимание, что когда вы пишете файл (в assignBlocks()
, я полагаю), если вы используете fwrite()
, вам также понадобится al oop, аналогичный fread()
.
Наконец, я предполагаю, что fileSize/512
должно быть количеством секторов в файле, но если файл составляет 1500 байт long, у него будет 3 сектора, тогда как fileSize/512
будет оцениваться как 2.
Как исправить: заменить fileSize/512
на (fileSize + 511) / 512
.