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.
Функция | Описание | 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;Чтобы открыть файл для чтения или записи, используйте C/C++ fopen функционируйте, как вы обычно были бы. Пока вы включали 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. Следующий пример показывает, как распечатать сообщение, показывающее размер большого файла:
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);
}