MATLAB® поддерживает использование 64-битных операций файлового ввода-вывода в ваших программах файла MEX. Можно читать и записать данные к файлам, которые составили и больше, чем 2 Гбайт (2 31-1 байт) в размере. Некоторые операционные системы или компиляторы не делают файлов поддержки, больше, чем 2 Гбайт. Следующие темы описывают, как использовать 64-битный файловый ввод-вывод в ваших файлах MEX.
Заголовочный файл io64.h задает многие типы и функции, требуемые для 64-битного файлового ввода-вывода. Оператор, чтобы включать этот файл должен быть первым
оператором #include в вашем исходном файле и должен также предшествовать, любой системный заголовок включают операторы:
#include "io64.h" #include "mex.h"
Чтобы объявить переменные, используемые в 64-битном файловом вводе-выводе, используйте следующие типы.
|
Тип MEX |
Описание |
POSIX |
|---|---|---|
|
|
Объявляет 64-битный тип |
|
|
|
Объявляет 64-битное целое число со знаком и типы беззнаковых целых чисел. Заданный в |
|
|
|
Объявляет, что структура содержит размер файла. Заданный в |
|
|
|
Используемый в |
|
|
|
Суффиксы для литерального |
|
Используйте следующие функции для 64-битного файлового ввода-вывода. Все заданы в заголовочном файле io64.h h.
|
Функция |
Описание |
POSIX |
|---|---|---|
|
|
Получает дескриптор файла от указателя файла |
|
|
|
Открывает файл и получает указатель файла |
|
|
|
Получает размер файла данной подсказки файла |
|
|
|
Получает положение файла для следующего ввода-вывода |
|
|
|
Получает размер файла данного имени файла |
|
|
|
Устанавливает положение файла для следующего ввода-вывода |
|
Чтобы присвоить подписанные и 64-битные целочисленные литеральные значения без знака, используйте определения типа int64_T и uint64_T.
В системах UNIX, чтобы присвоить литеральное значение целочисленной переменной, где значение, которое будет присвоено, больше, чем подписанный 2 31-1, необходимо снабдить суффиксом значение LL. Если значение больше, чем 2 32-1, без знака, то используйте LLU в качестве суффикса. Эти суффиксы не допустимы в системах Microsoft® Windows®.
LL и суффиксы LLU не требуются для hardcoded (литерал) значения меньше, чем 2 G (2 31-1), даже если они присвоены 64-битному типу int.
Следующий пример объявляет 64-битную целочисленную переменную, инициализированную с большим литеральным значением int и две 64-битных целочисленных переменные:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs,
const mxArray *prhs[])
{
#if defined(_MSC_VER) || defined(__BORLANDC__) /* Windows */
int64_T large_offset_example = 9000222000;
#else /* UNIX */
int64_T large_offset_example = 9000222000LL;
#endif
int64_T offset = 0;
int64_T position = 0;Чтобы открыть файл для чтения или записи, используйте функцию fopen C/C++, как вы обычно были бы. Пока вы включали io64.h в начале своей программы, fopen работает правильно на большие файлы. Никакие изменения вообще не требуются для fread, fwrite, fprintf, fscanf и fclose.
Следующие операторы открывают существующий файл для чтения и обновления в режиме двоичного счета.
fp = fopen(filename, "r+b");
if (NULL == fp)
{
/* File does not exist. Create new file for writing
* in binary mode.
*/
fp = fopen(filename, "wb");
if (NULL == fp)
{
sprintf(str, "Failed to open/create test file '%s'",
filename);
mexErrMsgIdAndTxt( "MyToolbox:myfnc:fileCreateError",
str);
return;
}
else
{
mexPrintf("New test file '%s' created\n",filename);
}
}
else mexPrintf("Existing test file '%s' opened\n",filename);Вы не можете распечатать 64-битные целые числа с помощью спецификатора преобразования %d. Вместо этого используйте FMT64, чтобы задать соответствующий формат для вашей платформы. FMT64 задан в заголовочном файле tmwtypes.h h. Следующий пример показывает, как распечатать сообщение, показывающее размер большого файла:
int64_T large_offset_example = 9000222000LL;
mexPrintf("Example large file size: %" FMT64 "d bytes.\n",
large_offset_example);Заменяя fseek и ftell с 64-битными ФункциямиANSI® C
fseek и функции ftell не являются 64-битным файловым вводом-выводом, способным на большинстве платформ. Функции setFilePos и getFilePos, однако, заданы как соответствующий POSIX®
fsetpos и fgetpos (или fsetpos64 и fgetpos64) как требуется вашей платформой/ОС. Эти функции являются 64-битным файловым вводом-выводом, способным на всех платформах.
Следующий пример показывает, как использовать setFilePos вместо fseek и getFilePos вместо ftell. Пример использует getFileFstat, чтобы найти размер файла. Это затем использует setFilePos, чтобы стремиться в конец файла подготовиться к добавлению данных в конце файла.
Несмотря на то, что параметр offset к setFilePos и getFilePos является действительно указателем на 64-битное целое число со знаком, int64_T, это должно быть брошено к fpos_T*. Тип fpos_T задан в io64.h как соответствующий fpos64_t или fpos_t, как требуется вашей платформой ОС.
getFileFstat(fileno(fp), &statbuf); fileSize = statbuf.st_size; offset = fileSize; setFilePos(fp, (fpos_T*) &offset); getFilePos(fp, (fpos_T*) &position );
В отличие от fseek, setFilePos поддерживает только абсолютный поиск относительно начала файла. Если вы хотите сделать, родственник ищет, сначала вызывает getFileFstat, чтобы получить размер файла. Затем преобразуйте относительное смещение в абсолютное смещение, которое можно передать setFilePos.
Получить размер открытого файла:
Обновите запись размера файла, сохраненного в памяти с помощью getFilePos и setFilePos.
Получите размер файла с помощью getFileFstat.
Прежде, чем попытаться получить размер открытого файла, сначала обновите запись размера файла, находящегося в памяти. Если вы пропускаете этот шаг на файле, который открыт для записи, возвращенный размер файла может быть неправильным или 0.
Чтобы обновить запись размера файла, ищите на любое смещение в файле с помощью setFilePos. Если вы не хотите менять положение указателя файла, можно искать на текущее положение в файле. Этот пример получает текущее смещение из запуска файла. Это затем стремится на текущее положение обновить размер файла, не перемещая указатель файла.
getFilePos( fp, (fpos_T*) &position); setFilePos( fp, (fpos_T*) &position);
Функция getFileFstat берет входной параметр дескриптора файла. Используйте функцию fileno, чтобы получить указатель файла открытого файла. getFileFstat возвращает размер того файла в байтах в поле st_size структуры structStat.
structStat statbuf;
int64_T fileSize = 0;
if (0 == getFileFstat(fileno(fp), &statbuf))
{
fileSize = statbuf.st_size;
mexPrintf("File size is %" FMT64 "d bytes\n", fileSize);
}Функция getFileStat берет имя файла закрытого файла как входной параметр. getFileStat возвращает размер файла в байтах в поле st_size структуры structStat.
structStat statbuf;
int64_T fileSize = 0;
if (0 == getFileStat(filename, &statbuf))
{
fileSize = statbuf.st_size;
mexPrintf("File size is %" FMT64 "d bytes\n", fileSize);
}