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

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

Я пытаюсь сделать так, чтобы каждый маленький файл начинался с определенной детализации, в моем случае 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.

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

0

Решение

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

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]