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