C以二进制模式读取/写入文件

时间:2013-08-17 21:24:24

标签: c fopen fwrite fread fseek

我创建了一个4000块的文件,其块大小为4096字节。 现在我想操作单个块并再次读取它们而不改变文件的大小。 实际上我想从另一个文件中将块写入我创建的文件中的特定块。 因此,我打开二进制模式的文件,如下所示:

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);
...
}

出于某种原因,我之前创建的文件更改了它的大小,并成为我想写入其中的文件的副本。

我做错了什么?

提前谢谢!

2 个答案:

答案 0 :(得分:3)

来自fopen手册页:

  

``w''截断为零长度或创建用于写入的文本文件。流位于文件的开头。

每次打开目标文件时都会删除目标文件。您可能对aa+

感兴趣
  

``a''开放写作。如果文件不存在,则创建该文件。流位于文件的末尾。对文件的后续写入将始终以当前文件末尾结束,无论是否有任何介入的fseek(3)或类似内容。

     

``a +''开放阅读和写作。如果文件不存在,则创建该文件。流位于文件的末尾。对文件的后续写入将始终以当前文件末尾结束,无论是否有任何介入的fseek(3)或类似内容。

答案 1 :(得分:0)

问题是你的搜索需要从文件的开头偏移一些字节。 由于块的长度为4096,因此偏移量为(长)i * 4096;

我认为你正在寻找错误的立场,因为freeBlocks [i]可能是一个地址。