Запись в двоичные файлы со смещением обнуляет все предыдущие байты - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь записать в новый файл с режимом 'wb' с заданным смещением, используя функцию owrite, указанную ниже, но каждый раз, когда он перезаписывает все байты до смещения. Использование windows 10, visual studio 2019 16.0.3.

Смещение - это положительное число и внешние границы файла (поскольку это новый файл). count == 64000 == размер буфера.

Я пытался использовать 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

1 Ответ

1 голос
/ 17 июня 2019

Вы говорите, чтобы он удалял существующее содержимое при открытии файла. Вы хотите «r +», а не «w» (или «r + b» в вашем случае).

С http://www.cplusplus.com/reference/cstdio/fopen/:

Запись "w": создать пустой файл для операций вывода. Если файл с таким именем уже существует, его содержимое отбрасывается, и файл обрабатывается как новый пустой файл.

Обратите внимание, что "r +" работает, только если файл уже существует. Если вы не знаете, существует ли файл, вам может понадобиться сначала проверить его и открыть с помощью «w» или «w +», если он не существует.

Если вы действительно хотите добавить в конец файла, а не к смещению в середине, вы можете использовать «a» или «a +», которые создадут файл, если он не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...