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); }