[英]C++ Modulo to align my data
我正在將幾個較小的文件編譯為一個大文件。
我正在嘗試使每個小文件都以一定的粒度開始,例如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
是自上一個4k邊界以來的字節數。 您需要直到下一個4k邊界的字節數,即(4096 - iStart % 4096) % 4096
。
您可以用if
代替外部模運算符,因為它的唯一目的是將4096
校正為0
並保持所有其他值不變。 如果4096的值是素數,那將是值得的。 但是由於4096實際上是4096,即2的冪,因此編譯器將使用位掩碼進行模運算(至少,如果iStart是未簽名的),因此上述表達式可能會更有效。
順便說一句,您可以將文件查找到末尾以外的位置,並且該文件將填充NUL個字節。 因此,您實際上並沒有自己做的所有事情:
fseek()函數應允許將文件位置指示符設置為超出文件中現有數據的末尾。 如果此時稍后再寫入數據,則隨后在間隙中讀取數據將返回值為0的字節,直到將數據實際寫入間隙中為止。 (Posix 2008)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.