Почему BACKSPACE (\b) не работает, как предполагалось, с файлом?

Я открыл (текстовый) файл, вот так: File *fp = fopen("findPattern2.txt", "w+"); в котором я написал текст. Последний персонаж, который у меня есть, это ,, Теперь я хочу удалить этот символ, используя клавишу Backspace. Я прочитал ответы здесь, что BACKSPACE только перемещает курсор, затем я должен перезаписать этот символ, написав поверх него, и это то, что я делаю. Так я и сделал fprintf(fp, "\b \b") полностью стереть ,, но вместо этого это то, что файл показывает потом:,BS BS, Все это работает с терминалом. Почему не с файлом?

Из того, что я понял, единственный способ сделать это для файла был бы, если бы я отобразил его в памяти, отредактировал его содержимое, скопировал их в новый файл и удалил старый.

3 ответа

Решение

Файл - это просто набор байтов, которые при чтении программой дают (возможно) значимые результаты, такие как картинка, видео или что-то еще. Если программа не знает, что символ возврата должен удалить исходящий символ, она ничего не сделает.

Ваш терминал - это программа, которая была написана именно таким образом, чтобы реагировать на специальные символы, такие как backspace, и знает, что делать, когда получает один из них.

Если вы "printf" BS символ к терминалу, последний интерпретирует это так, что курсор будет перемещен влево.

Но если вы "fprintf" BS символ в файл, то BS символ (который является просто байтом) будет просто записан в файл.

Курсоры и редактирование строк - это то, что есть в консолях и терминалах, а не в файлах.

Вы, похоже, неправильно понимаете, как работают файлы.

Там просто нет концепции редактирования внутри файла, это последовательность байтов. Вы можете перезаписать с помощью fseek() переместить текущее местоположение (иногда называемое "курсор", но это аналогия, это не значит, что файлы действуют как текстовые редакторы), а затем записать новые данные.

Другие вопросы по тегам