在偏移量为零的二进制文件上写入所有先前字节

时间:2019-06-17 08:04:14

标签: c windows visual-studio binaryfiles

我正在尝试使用下面提供的函数owrite在给定的偏移量下以'wb'模式写入新文件,但是每次它覆盖该偏移量之前的所有字节时。 使用Windows 10,Visual Studio 2019 16.0.3。

偏移量是正数,在文件边界之外(因为它是新文件)。 计数== 64000 ==缓冲区的大小。

我尝试使用lseek / _lseek写入/ _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

1 个答案:

答案 0 :(得分:1)

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

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

“ w”写:创建用于输出操作的空文件。如果已经存在同名文件,则其内容将被丢弃,并将该文件视为新的空文件。

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

如果您确实要添加到文件的末尾而不是中间的偏移量,则可以使用“ a”或“ a +”,如果文件不存在,则会创建该文件。