Как обрезать файл с конца? (кроссплатформенный) - PullRequest
4 голосов
/ 16 марта 2012

Я пытаюсь найти кроссплатформенный метод для удаления X байтов из конца файла.

В настоящее время я нашел:

  • Платформаконкретные решения (такие как усечение для posix): это то, что я не хочу, потому что я хочу, чтобы программа C ++ работала на нескольких платформах.

  • Читать во всем файле иснова запишите файл минус байты, которые я хочу удалить: я хотел бы избежать этого настолько, насколько я могу, так как я хочу, чтобы программа была максимально эффективной и быстрой

Любойидеи?

Если есть метод / функция "перейти к концу потока файла", могу ли я затем перемотать X байтов и обрезать оставшуюся часть файла или что-то подобное?

Ответы [ 3 ]

4 голосов
/ 16 марта 2012

Как вы думаете, как работают кроссплатформенные функции? Просто создайте свою собственную функцию следующим образом:

int truncate(int fd, long size)
{
#ifdef _WIN32 || _WIN64 
    return _chsize(fd, size);
#else
  #ifdef POSIX
    return ftruncate(fd, size);
  #else
    // code for other OSes
  #endif
#endif
}
1 голос
/ 16 марта 2012

Нет такой вещи в стандартной библиотеке. Они поддерживают потоки - но потоки не имеют концов, у файлов есть концы - в настоящее время.

Все, что вы можете сделать, это написать кроссплатформенную оболочку для функции.

0 голосов
/ 23 июля 2012

Библиотека Boost.Filesystem (версия 1.44 и выше) предоставляет функцию resize_file .

...