0

いくつかの小さなファイルを 1 つの大きなファイルにコンパイルしています。

各小さなファイルが特定の粒度、私の場合は 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になると予想していました。

誰かが私の間違いを見ますか?

4

1 に答える 1

0

iStart % 4096前の 4k 境界以降のバイト数です。次の 4k 境界までのバイト数が必要です(4096 - iStart % 4096) % 4096

外部モジュロ演算子を に置き換えることができます。これは、他のすべての値を修正してそのままにしておくifことが唯一の目的であるためです。たとえば、4096 の値が素数である場合、それは価値があります。しかし、4096 は実際には 4096 であり、2 のべき乗であるため、コンパイラはビット マスクを使用してモジュロ演算を実行します (少なくとも、iStart が符号なしの場合)。したがって、上記の式はおそらくより効率的です。40960

ところで、ファイルを末尾を超えた位置まで fseek することは許可されており、ファイルは NUL バイトで埋められます。したがって、実際には自分ですべての作業を行う必要はありません。

fseek() 関数を使用すると、ファイル位置インジケータをファイル内の既存のデータの末尾を超えて設定できます。この時点でデータが後で書き込まれる場合、データが実際にギャップに書き込まれるまで、ギャップ内のデータの後続の読み取りは値 0 のバイトを返します。 (Posix 2008)

于 2013-10-12T22:11:45.323 に答える