Прежде чем говорить о том, что быстрее, сначала мы должны показать, что они эквивалентны. Это не так.
Просто поиск по 0 недостаточен, чтобы убедиться, что весь контент перезаписан. Что делать, если новый контент короче? Вы должны искать и обрезать, чтобы быть уверенным.
Нет стандартного способа обрезать открытый файл. POSIX имеет ftruncate
и Windows имеет SetEndOfFile
. fopen(filename, "w")
является стандартным C. Поэтому поиск и усечение приводят к проблемам совместимости.
См. Существует ли гарантированный и безопасный способ обрезать файл из указателя ANSI C FILE? и Как обрезать файл в C? .
Существует еще одно тонкое отличие в удалении файла. На Unix, если вы удаляете файл, любые открытые дескрипторы файлов остаются открытыми. Данные остаются до тех пор, пока все файловые дескрипторы не будут закрыты. Это обычно используется для обеспечения безопасных временных файлов: откройте временный файл для чтения и записи, немедленно удалите файл и продолжайте чтение и запись в дескриптор открытого файла. Невидимый временный файл.
Допустим, ваш файл удален, а ваш дескриптор файла открыт. Если вы ищете и усекаете, вы все еще работаете с теми же данными, но файла нет. Если вы fopen
вы пишете в новый файл. Это может повлиять на поведение и безопасность.
Существуют похожие проблемы с переименованием файлов. Если ваш файл был переименован при открытом дескрипторе файла, поиск и усечение будут работать с переименованным файлом ( существуют различные непереносимые способы получения имени файла из дескриптора файла ). fopen
откроет файл со старым именем.
Что быстрее? Вероятно, искать и обрезать. fopen
все равно придется это сделать, а также накладные расходы на поиск данных, связанных с именем файла, проверку разрешений и т. Д. c ...
Вы можете сравнительно легко протестировать это. Вы также можете использовать strace
или эквивалент для вашей операционной системы, чтобы посмотреть базовые системные вызовы.