2010-07-15 3 views
2

Возможно ли очистить содержимое (то есть установить EOF в начало/сброс файла) на C++, зная только ФАЙЛ *? Я пишу временный файл с доступом wb + и иногда хочу его очистить и усечь, не добавляя вызовы fclose и fopen. Я не думаю, что это возможно ... но если нет, почему бы и нет?Очистка содержимого файла на C++, зная только FILE *

Заранее благодарен!

+3

Вне темы: Почему вы используете 'FILE *' в C++? Потоки безопаснее и проще. – GManNickG

+0

Я на самом деле добавляю к чужой код и не хочу реорганизовывать все это потоками. – Cenoc

+0

@GMan: Итак, если вы получите открытый экземпляр fstream, как вы собираетесь это делать с потоками? –

ответ

7

Это будет зависеть от вашей платформы. Стандарт POSIX предоставляет ftruncate(), для которого требуется дескриптор файла, а не указатель FILE, но он также предоставляет fileno(), чтобы получить дескриптор файла из указателя FILE.

Аналогичные объекты будут доступны в средах Windows - но под разными названиями.

+0

(Кроме того, 'ftruncate' требует, чтобы файл был открыт для записи.) – stakx

+0

@stakx: Поскольку файл открыт 'wb +', это не проблема. –

0

Я не верю, что это можно сделать, используя только FILE*. Вы всегда можете записывать нулевые данные в конец файла, но это не приведет к его усечению.

Альтернативно, если у вас есть доступ к имени файла (я не могу сказать из вопроса), вы можете использовать freopen, который скрывает закрытие/открытие/усечение в один вызов функции.

+1

@Cenoc: «Считалось странным, что они решили дать вам возможность расширяться, но не сокращать». Я вспоминаю, что обоснование для этого состоит в том, что были (есть?) Системы, которые не имели возможности сокращать файлы. Похоже, что могла быть лучшая альтернатива (вернуть ошибку на эти системы?), Но опять же, это может быть даже не так. –

Смежные вопросы