C ++ по модулю для выравнивания моих данных

0

Я собираю несколько небольших файлов в один большой файл.

Я пытаюсь сделать так, чтобы каждый маленький файл начинался с определенной детализации, в моем случае 4096.

Поэтому я заполняю промежуток между каждым файлом.

Для этого я использовал

//Have a look at the current file size
unsigned long iStart=ftell(outfile);

//Calculate how many bytes we have to add to fill the gap to fulfill the granularity
unsigned long iBytesToWrite=iStart % 4096;

//write some empty bytes to fill the gap
vector <unsigned char>nBytes;
nBytes.resize(iBytesToWrite+1);
fwrite(&nBytes[0],iBytesToWrite,1,outfile);

//Now have a look at the file size again
iStart=ftell(outfile);

//And check granularity
unsigned long iCheck=iStart % 4096;
if (iCheck!=0)
{
    DebugBreak();
}

Однако iCheck возвращает

 iCheck = 3503

Я ожидал, что это будет 0.

Кто-нибудь видит мою ошибку?

Теги:
math
modulo
granularity

1 ответ

0

iStart % 4096 - это количество байтов с предыдущей границы 4k. Вы хотите количество байтов до следующей границы 4k, которая равна (4096 - iStart % 4096) % 4096.

Вы можете заменить внешний modulo-оператор на if, поскольку его цель - исправить 4096 до 0 и оставить все остальные значения нетронутыми. Это было бы полезно, если бы значение 4096 было, скажем, простым. Но так как 4096 на самом деле 4096, то есть мощность 2, компилятор выполнит операцию по модулю с битовой маской (по крайней мере, при условии, что iStart без знака), поэтому вышеприведенное выражение, вероятно, будет более эффективным.

Кстати, вам разрешено fseek файл в позицию за пределами конца, и файл будет заполнен байтами NUL. Таким образом, вы фактически не делаете все, что работает самостоятельно:

Функция fseek() должна позволять устанавливать указатель позиции файла за пределы существующих данных в файле. Если данные позже будут записаны в этот момент, последующие чтения данных в пробеле должны возвращать байты со значением 0, пока данные не будут фактически записаны в промежуток. (Posix 2008)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню