Как читаются файлы

Здравствуйте!
Я новичок и хочу узнать, как приложениями читаются файлы?
Например, есть файл текста.
Есть редактор, открывающий этот файл.
Когда файл открывается редактором, как он читает этот файл? С начала или с конца?
Когда я записываю строку в файле, курсор ведь обозначает указатель на конец файла?

Смотря как открыть. Обычно в функции открытия можно указать начальную позицию + функции типа seek.

Смотря что за редактор :man_shrugging:
Если файлы не гигабайтный, то обычно нет смысла как-то оптимизировать чтение, просто весь прочитать.
А так есть утилиты типа tail для чтения только конца (например, логов).
Но функции чтения файлов обычно не умеют читать в обратном направлении, так что для такого придется читать сколько-то, отходить и т.д.

1 лайк

Спасибо. Т.е. если у меня текстовый файл со строкой 1234567890, то он будет так и считываться, например - в стек. Но тогда опять чтобы создать файл, мне надо как-то сдвигать что-ли символы?
Т.е. взял из стека 0, записал в файл, потом 9 и надо сдвигать 0?

Зачем?
Обычно просто перезаписывают весь файл новым содержимым.

Ну вот представьте массив текста очень большой и он сформирован в процессе какой-либо деятельности и в результате этой деятельности расположен в стеке. Первый байт текста для файла в самом низу стека.
Теперь мне надо этот файл записать на диск. Можно ли это сделать последовательно? Или надо вынимать всё содержимое стека в оперативную память, там располагать, и оттуда записывать на диск в файл?

А они точно в стеке должны быть?)
Есть например deque.

Ну а вообще работа с памятью намного быстрее работы с файлами, так что да, обычно лучше в памяти всё подготовить.

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

Я пытаюсь понять логику. Поэтому привожу примеры не практичные, но для меня понятные.
Поэтому повторюсь с описанием примера.
представьте массив текста очень большой и он сформирован в процессе какой-либо деятельности и в результате этой деятельности расположен в стеке. Первый байт текста для файла в самом низу стека.
Теперь мне надо это записать на диск в файл. Можно ли это сделать последовательно?
Не вынимая всё содержимое из стека.

Ну файл вряд ли получится писать с конца в начало, только если выделить нужный размер, перейти в (конец - размер_буфера), записать буфер, отойти на (конец - 2 * размер_буфера) и т.д. (размер буфера можно и 1 байт сделать, но наверно это будет медленнее, хотя может ОС оптимизирует)

Еще наверно можно с помощью

Еще с текстом надо помнить, что разные символы в юникоде занимают разное количество байтов.

А вообще вряд ли бывают такие реализации стека, что нельзя с той же скоростью идти снизу вверх ) Там же массив или связный список внутри, так что можно просто заменить стек на дек и т.п.
Если бы много у кого была необходимость такое делать, то видимо оптимизировали бы файловые системы и функции ОС под такую работу.