【问题标题】:C reading/writing to a file in binary modeC以二进制模式读/写文件
【发布时间】:2018-06-26 03:37:19
【问题描述】:

我创建了一个包含 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);
...
}

由于某种原因,我之前创建的文件改变了它的大小,变成了我想写入的文件的副本。

我做错了什么?

提前谢谢你!

【问题讨论】:

    标签: c fopen fwrite fread fseek


    【解决方案1】:

    来自fopen 手册页:

    ``w'' 截断到零长度或创建文本文件以进行写入。流位于文件的开头。

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

    ``a'' 打开以供写入。如果文件不存在,则创建该文件。流位于文件的末尾。对文件的后续写入将始终在文件的当前末尾结束,而与任何干预 fseek(3) 或类似内容无关。

    ``a+'' 为读写打开。如果文件不存在,则创建该文件。流位于文件的末尾。对文件的后续写入将始终在文件的当前末尾结束,而与任何干预 fseek(3) 或类似内容无关。

    【讨论】:

    • 一个可笑的错误。 r 用于读取,w 用于写入(读取 覆盖),a 用于追加。
    【解决方案2】:

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

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

    【讨论】:

    • 为什么是 (long)i*4096 ?我也在循环结束时做一个倒带(文件)。这应该让我回到开始。你能进一步解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2019-04-20
    • 2019-09-18
    • 1970-01-01
    • 2013-07-10
    • 2020-09-09
    相关资源
    最近更新 更多