1

ブロックサイズが 4096 バイトの 4000 ブロックのファイルを作成しました。ここで、単一のブロックを操作し、ファイルのサイズを変更せずにそれらを再度読み取りたいと考えています。実際には、作成したファイル内の特定のブロックに別のファイルからブロックを書きたいと思っています。したがって、次のようにファイルをバイナリモードで開いています。

FILE * storeFile=fopen(targetFile, "wb");  // this one I created before
FILE * sourceFILE=fopen(sourceFile,"rb");

今、私はポインタへのものを読み込もうとしています

char * ptr=malloc(4096);
...
for(i=0; i<blocks_needed; i++)
{
    fread(ptr,4096,1,sourceFile);
    // now I am going to the position of the blocks I want to write to
    fseek(storeFile,freeBlocks[i]*4096,SEEK_SET);
    // and now I am writing it to the File I created before
    fwrite(ptr,4096,1,storeFile);
...
}

何らかの理由で、以前に作成したファイルのサイズが変更され、書き込みたいファイルのコピーになります。

私は何を間違っていますか?

前もって感謝します!

4

2 に答える 2

4

fopenマニュアルページから:

``w'' 長さ 0 に切り捨てるか、書き込み用のテキスト ファイルを作成します。ストリームはファイルの先頭に配置されます。

宛先ファイルを開くたびに消去しています。aまたはに興味があるかもしれませんa+

``a'' 書き込み用に開きます。ファイルが存在しない場合は作成されます。ストリームはファイルの最後に配置されます。ファイルへの後続の書き込みは、介在する fseek(3) などに関係なく、常にその時点でのファイルの終わりで終了します。

``a+'' 読み書き用にオープン。ファイルが存在しない場合は作成されます。ストリームはファイルの最後に配置されます。ファイルへの後続の書き込みは、介在する fseek(3) などに関係なく、常にその時点でのファイルの終わりで終了します。

于 2013-08-17T21:26:46.647 に答える