Что такое режим указателя файла?

Что это за указатель режима, что это за режим, 'insert' или overwrite?

Поскольку я новичок в file pointer в C, возможно, мой вопрос довольно глупый. Мне очень жаль, если кто-то это чувствует.

И что я могу сделать, если хочу insert some character в существующий файл, но не терять ни одного символа в этом файле.


person mja    schedule 03.01.2016    source источник
comment
Честно говоря, я не понял вашего вопроса. Какой режим?   -  person Sourav Ghosh    schedule 03.01.2016
comment
Вы имеете в виду режим чтения, записи, добавления?   -  person haccks    schedule 03.01.2016
comment
Он не контролируется самим C, когда вы scanf() или fgets() управление передается операционной системе.   -  person pmg    schedule 03.01.2016
comment
Рекомендую прочитать документацию к fopen().   -  person alk    schedule 03.01.2016
comment
@pmg - это неверно из-за использования буфера   -  person Ed Heal    schedule 03.01.2016
comment
@EdHeal ... и этот буфер заполняется данными из операционной системы.   -  person pmg    schedule 03.01.2016
comment
Он не всегда передается, как подразумевается в вашем комментарии   -  person Ed Heal    schedule 03.01.2016
comment
С обновлением вопроса он теперь, как правило, дублирует этот: stackoverflow.com/q/2431073/694576   -  person alk    schedule 03.01.2016


Ответы (2)


Я не знаю файловых систем, поддерживающих режим вставки.

Семантика C для записи в файловые потоки:

  • усечение для "w". При успешном fopen() текущее содержимое файла теряется.
  • перезапись содержимого файла для "r+". Только байт, явно записанный в файл, перезапишет существующее содержимое, остальное не изменится. Запись за пределами конца файла увеличит его размер, как и в режиме добавления.
  • добавление в файл для "a". Каждая операция записи происходит в конце файла.

Обратите внимание, что "w" и "a" также создадут файл, если он не существует.

Чтобы вставить содержимое в середину существующего файла, вы должны скопировать содержимое в новый файл, записав новое содержимое в соответствующие места. Вы можете переименовать новый файл в старое, закрыв оба и удалив старый.

person chqrlie    schedule 03.01.2016
comment
@DDK: Не могли бы вы щелкнуть серую галочку ниже, чтобы набрать балл и принять ответ? - person chqrlie; 04.01.2016

Зависит от того, как вы его открываете:

Чтобы добавить:

fopen("myfile.txt", "a");

Чтобы записать (перезаписать):

fopen("myfile.txt", "w");
person Hatted Rooster    schedule 03.01.2016
comment
Утверждение, что добавление может вставить, вводит в заблуждение. В общем, вставка невозможна. - person alk; 03.01.2016
comment
@alk Возможно, редактировал. Однако в общем виде вставка и перезапись часть меня сказала, что OP, вероятно, означает добавление. - person Hatted Rooster; 03.01.2016
comment
"w" не позволяет частичную перезапись содержимого файла, выходной файл обрезается до длины 0 или создается, если он не существует - person chqrlie; 03.01.2016
comment
@chrqlie Да, перезапись файла. - person Hatted Rooster; 03.01.2016
comment
@JameyD: перезапись неоднозначна. Если вы собираетесь перезаписать, скажем, пятый байт файла, а остальные оставить нетронутыми, "w" не подходит, следует использовать "r+". OP использует режимы вставки и перезаписи, как в текстовом редакторе. - person chqrlie; 03.01.2016