簡體   English   中英

C ++ Modulo對齊我的數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM