Я собираю несколько небольших файлов в один большой файл.
Я пытаюсь сделать так, чтобы каждый маленький файл начинался с определенной детализации, в моем случае 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.
Кто-нибудь видит мою ошибку?
iStart % 4096
это количество байтов поскольку предыдущая 4к-граница. Вы хотите количество байтов до тех пор следующая 4k-граница, которая (4096 - iStart % 4096) % 4096
,
Вы можете заменить внешний оператор по модулю if
, поскольку единственная цель состоит в том, чтобы исправить 4096
в 0
и оставьте все остальные ценности нетронутыми. Это было бы целесообразно, если бы значение 4096 было, скажем, простым. Но поскольку 4096 — это фактически 4096, то есть степень 2, компилятор выполнит операцию по модулю с битовой маской (по крайней мере, при условии, что iStart не подписан), поэтому приведенное выше выражение, вероятно, будет более эффективным.
Кстати, вам разрешено искать файл в позиции за концом, и файл будет заполнен байтами NUL. Таким образом, вы на самом деле не должны делать всю эту работу самостоятельно:
Функция fseek () должна позволять устанавливать индикатор положения файла после конца существующих данных в файле. Если в этот момент данные записываются позже, последующие чтения данных в промежутке должны возвращать байты со значением 0, пока данные фактически не будут записаны в промежуток.
(Posix 2008)
Других решений пока нет …