Какая разница между `fseek`,` lseek`, `seekg`,` seekp`?

Меня спросил у интервьюера, как я могу реализовать tail (да, тот, что в оболочке Linux). Мой ответ был, сначала ищите конец файла, а затем читайте символы один за другим вперед, если встречается с \n, означает, что одна строка опустилась, бла-бла-бла. Я полагаю, что мой ответ правильный.

Затем я нашел эту проблему, которую я должен использовать для реализации tail? Я думал, что могу просто использовать seekg (С++ thing?), Но мне сказали, что я должен использовать lseek (системный вызов linux?).

Итак, включая fseek (объект ANSI C?), который я должен использовать для реализации tail? И есть ли какая-то большая разница между ними?

Ответы

Ответ 1

Используйте seekg при использовании библиотеки IOstream С++. seekp здесь бесполезно, так как он устанавливает указатель put.

Используйте fseek при использовании библиотеки C stdio. Используйте lseek при использовании низкоуровневого ввода-вывода дескриптора файла POSIX.

Разница между различными функциями поиска - это просто тип файлов/потоков, на которых они работают. В Linux seekg и fseek, вероятно, реализованы в терминах lseek.