Перезаписать содержимое файла на C

Я пытаюсь перезаписать содержимое файла, используя fwrite(), fseek() в C, но это не работает.

Размер файла 30. Я хочу написать «ABCD», перезаписав позицию 10 ~ 13 в файле. Поэтому я программирую ниже.

FILE *fp = fopen("file.txt", "a+");
fseek(fp, 10, SEEK_SET); 
fwrite("ABCD", 1, 4, fp);

Но "ABCD" пишется после 30 позиции в файле. Я нашел несколько советов использовать двоичный режим (например, "ab+"), но 'b' игнорируется во всех системах, соответствующих стандарту POSIX.

Как я могу это сделать?


person Frodo    schedule 19.05.2018    source источник
comment
Почему вы открываете файл для добавления? Режим "a+" открывается для чтения и добавления. Используйте режим "r+".   -  person Weather Vane    schedule 19.05.2018
comment
О, это хорошо работает при использовании r+. Благодарю вас!   -  person Frodo    schedule 19.05.2018
comment
Для потоков, открытых в текстовом режиме, fseek имеет ограниченное применение, поскольку перевод каретки с переводом строки может привести к тому, что fseek приведет к неожиданным результатам.   -  person Weather Vane    schedule 19.05.2018
comment
В режиме добавления все операции записи происходят в конец файла; нет способа расположить файл и записать в заданной позиции (используя функции FILE *; правила немного отличаются, если вы переходите к файловым дескрипторам и используете pwrite()).   -  person Jonathan Leffler    schedule 19.05.2018


Ответы (1)


Используйте режим "r+", чтобы открыть файл вместо "a+" (b для двоичного файла является необязательным и практически неуместным в системах POSIX): -

#include <stdlib.h>
#include <stdio.h>

int main(void){
    FILE *fp = fopen("file.txt", "r+");
    fseek(fp, 10, SEEK_SET);
    fwrite("ABCD", 1, 4, fp);
    fclose(fp);

    return 0;
}
person nandal    schedule 19.05.2018