【问题标题】:Writing to binary files at offset zeroes all previous bytes在偏移量处写入二进制文件会将所有先前的字节
【发布时间】:2019-06-17 08:04:14
【问题描述】:

我正在尝试使用下面提供的函数 owrite 在给定偏移量处以“wb”模式写入一个新文件,但每次它都会覆盖偏移量之前的所有字节。 使用 windows 10、visual studio 2019 16.0.3。

偏移量是正数并且超出文件范围(因为它是一个新文件)。 count == 64000 == buf 的大小。

我尝试使用 lseek/_lseek write/_write(使用 fileno),但结果相似。 owrite 不返回 -1,还检查了 fwrite 的输出,一切似乎都很好。执行此操作的正确方法是什么?

int owrite(FILE* fd, char* buf, size_t count, int offset)
{
    if (fseek(fd, offset, SEEK_SET) != 0) {
        return -1;
    }
    fwrite((char*)buf, sizeof(char), count, fd);
    fseek(fd, 0, SEEK_SET);
    return 0;
}

这里还有调用 owrite 的函数:

void insert_chunk(byte* buffer, int len, char* filename, long offset)
{
    FILE* builded_file = fopen(filename, "wb");
    owrite(builded_file, buffer, len, offset);
    fclose(builded_file);
}

//byte is unsigned char

【问题讨论】:

  • 如果它是一个新文件,它的开始和你寻找的偏移量之间没有任何字节。如果有,请发布显示问题的Minimal Reproducible Example
  • 如果您需要写入现有文件的偏移量,请使用"r+b" 模式。

标签: c windows visual-studio binaryfiles


【解决方案1】:

您告诉它在打开文件时丢弃现有内容。您想要“r+”,而不是“w”(或者,在您的情况下为“r+b”)。

来自http://www.cplusplus.com/reference/cstdio/fopen/

"w" write:为输出操作创建一个空文件。如果已存在同名文件,则丢弃其内容,并将该文件视为新的空文件。

请注意,“r+”仅在文件已存在时才有效。如果您不知道该文件是否存在,您可能需要先检查该文件,如果不存在则使用“w”或“w+”打开。

如果你真的想添加到文件的末尾,而不是中间的偏移量,你可以使用“a”或“a+”,如果文件不存在,它将创建文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多