繁体   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