gpt4 book ai didi

c - 在偏移量处写入二进制文件会将所有先前字节归零

转载 作者:行者123 更新时间:2023-11-30 14:38:23 24 4
gpt4 key购买 nike

我正在尝试使用下面提供的函数 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

最佳答案

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

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

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

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

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

关于c - 在偏移量处写入二进制文件会将所有先前字节归零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56627146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com