2013-07-25 3 views
0

После прочтения большого отчета о stackoverflow я решил пойти с файлом * (поверх std :: fstream), чтобы быстро манипулировать моими двоичными файлами. Кроме того, мне нужно было усечь мой файл во время процесса (_chsize или ftruncate), который будет работать только с файловым дескриптором (вызов fileno).Размер off_t во время компиляции

Так что я пытаюсь что-то вроде этого работы (C++):

#define _FILE_OFFSET_BITS 64 
#include <stdio.h> 
static inline off_t FTello(FILE *stream) 
{ 
#if _WIN32 
#if defined(__MINGW32__) 
    return ftell(stream); // 32bits 
#else 
    return _ftelli64(stream); 
#endif 
#else 
    return ftello(stream); 
#endif 
} 

Однако это явно не работает на Visual Studio. Я не мог найти нигде в документации способ изменить размер off_t во время компиляции.

Было бы заманчиво иметь подпись, как это (я предполагаю, что у меня есть C99: stdint.h):

static inline int64_t FTello(FILE *stream) 

То, что другие делали?

Для справки, вот что я читал, что, кажется, указывает FILE * обеспечивают лучшую производительность:

+0

Сделать typedef? –

+1

Что не так с использованием 'off_t' в себе? Он должен быть подходящим для любого 'FILE *', который вы используете. –

+0

** Почему ** вы идете с 'FILE *'? Нет ничего плохого в 'std :: ofstream'. Производительность не является проблемой - это точно так же быстро, как 'FILE *'. –

ответ

1

Если вы уже принуждая поддержку больших файлов, просто определить FTello(), чтобы вернуть int64_t.

Возможно, вы нашли inttypes.h более портативным, чем stdint.h.

MS не известен как совместимый с UNIX, хотя они предоставляют аналогичные функции. Если вы собираетесь предоставить уровень совместимости, лучше изучите, что делают существующие слои (например, boost.filesystem), везде есть тонкости.

Кстати, boost.filesystem имеет resize_file().

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