2013-06-19 3 views
1

Я с удивлением говорю, что я не нашел разумного решения о том, как изменить размер файла с использованием стандартных библиотек C++. Кажется совершенно глупым и расточительным, чтобы читать данные из исходного файла, а затем записывать его в другой файл. Я просто хочу метод изменения размера, который отрубает данные, выходящие за пределы этого размера ... Есть ли что-нибудь, что делает это?Изменение размера файла в C++

EDIT: Если мне нужно использовать метод, описанный выше, насколько большой должен быть мой буфер, который я использую для чтения/записи? Я, очевидно, не могу сразу прочитать весь файл, потому что здесь я работаю с довольно большими файлами.

+0

Это приведет к фрагментации файлов, которые вам придется очищать, но вы можете просто переписать конец файлов с символами EOF? – Precastic

+0

Какая у вас больше картинка? «Изменение размера» имеет много значений! –

+0

Вызывается API-интерфейс, разрешенный в вашем проекте? У Linux есть системный вызов 'truncate' установочных файлов на указанную длину. Я думаю, что Windows предоставит сравнительный API. Кстати, какая у вас платформа? –

ответ

0

Изменение размера файла без загрузки полного изображения является довольно сложной задачей даже для языков более высокого уровня, в основном это функция обработки SDK изображений, например Image Magick.

Если каких-либо конкретных требований к качеству или поддерживаемым форматам не требуется, я думаю, что ответ Марка будет самым простым способом. В противном случае вам нужно включить библиотеки графического формата и реализовать алгоритм изменения размера вручную (или использовать некоторые библиотеки тоже).

+0

Спасибо, что ответили на вопрос. Я думаю, что пойду с помощью метода чтения/записи. – hetelek

+0

Откуда у вас были изображения/картинки? ОП отмечает нулевое значение. –

7

Вы можете использовать функции, предоставляемые Boost.Filesystem, в частности его функцию resize_file().

Обратите внимание, что Boost.Filesystem (планируется включить) в будущие итерации языкового стандарта. См. here. Это хорошая новость, если вы не хотите использовать Boost в своем проекте.

Кроме того, как уже упоминал @BenjaminLindley, заголовок <filesytem> уже доступен в Visual Studio 2012 (see here; поиск по «файловой системе»).

+0

Спасибо за это, но, к сожалению, мой проект не полагается на Boost, и я хотел бы сохранить его таким образом. – hetelek

+1

@hetelek Почему бы и нет? Вы не можете использовать все, что он предлагает, но вы обязательно найдете некоторые его части, которые могут сэкономить много времени на разработку. –

+0

@MarkGarcia У меня нет ничего против Boost, но у меня есть большой проект, который не полагается на повышение в другом месте, и я не буду использовать его только для этого, не возвращаясь и не меняя их всех. Кроме того, мне просто нравится, что он зависит только от стандартных библиотек. – hetelek

0

Действительно, нет кросс-платформенного метода для изменения размера файла, поскольку стандарт не описывает эту функциональность. Но, как сказано here, для этой цели существуют API-интерфейсы платформы: см. Функцию _chsize() для функций Windows, truncate() и ftruncate() для систем POSIX.

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