写入偏移量为零的二进制文件会将所有先前的字节置为零
Writing to binary files at offset zeroes all previous bytes
我正在尝试使用下面提供的函数 owrite 在给定偏移量处以 'wb' 模式写入新文件,但每次它都会覆盖偏移量之前的所有字节。
使用 windows 10, visual studio 2019 16.0.3.
偏移量是正数并且在文件边界之外(因为它是一个新文件)。
计数 == 64000 == buf 的大小。
我试过使用 lseek/_lseek write/_write(带 fileno)但结果相似。 owrite 不要 return -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+",如果确实如此,它们将创建文件不存在。
我正在尝试使用下面提供的函数 owrite 在给定偏移量处以 'wb' 模式写入新文件,但每次它都会覆盖偏移量之前的所有字节。 使用 windows 10, visual studio 2019 16.0.3.
偏移量是正数并且在文件边界之外(因为它是一个新文件)。 计数 == 64000 == buf 的大小。
我试过使用 lseek/_lseek write/_write(带 fileno)但结果相似。 owrite 不要 return -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+",如果确实如此,它们将创建文件不存在。