主要内容

墨西哥人文件中处理大文件I / O

先决条件使用64位的I / O

MATLAB®金宝app支持使用64位墨西哥人文件中文件I / O操作程序。你可以读取和写入数据文件和大于2 GB (2还有字节)。一些操作系统和编译器不支持文件大于2 GB。金宝app以下主题描述如何使用64位墨西哥人文件文件I / O。

头文件

头文件io64.h定义了许多类型和功能所需的64位文件I / O。声明必须包含这个文件第一个# include声明你的源文件,还必须先于任何系统头包括语句:

# include“io64。h mex.h“# include

类型声明

声明变量用于64位文件I / O,使用以下类型。

墨西哥人类型

描述

POSIX

fpos_T

这是一个64位的说的int类型setFilePos ()getFilePos ()。中定义的io64.h

fpos_t

int64_T, uint64_T

宣布64位签署和无符号整数类型。中定义的tmwtypes.h

,

structStat

声明一个结构来保存一个文件的大小。中定义的io64.h

struct stat

FMT64

中使用的mexPrintf在这样的格式说明符指定长度% d。看到一节中的示例打印格式的消息FMT64定义在tmwtypes.h

% lld

噢,LLU

后缀为文字int常数(C标准ISO 64位值®/ IEC 9899:1999 (E) 6.4.4.1节)。只在UNIX上使用®系统。

,LLU

功能

使用下面的函数64位文件I / O。都是在头文件中定义的io64.h

函数

描述

POSIX

fileno ()

得到一个文件描述符从文件指针

fileno ()

fopen ()

打开该文件并获得文件指针

fopen ()

getFileFstat ()

获取文件大小给定文件的指针

fstat ()

getFilePos ()

得到文件的位置在接下来的I / O

fgetpos ()

getFileStat ()

获取给定文件名的文件大小

stat ()

setFilePos ()

设置文件位置为下一个I / O

fsetpos ()

指定文字值不变

将签署和无符号64位整数文字值,使用类型定义int64_Tuint64_T

在UNIX系统中,将一个文本值分配给一个整数变量的值大于分配231日1签署,必须后缀与价值。如果该值大于2321无符号,然后用LLU作为后缀。这些后缀不是有效的在微软®窗户®系统。

请注意

LLU后缀不需要硬编码值小于(文字)2 G (231日1),即使他们被分配到一个64位的int类型。

下面的示例声明一个64位整数变量初始化,文字int价值,和两个64位整数变量:

空白mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs[]){#如果定义(_MSC_VER) | | (__BORLANDC__)定义Windows * / / * int64_T large_offset_example = 9000222000;#其他UNIX / * * / int64_T large_offset_example = 9000222000我;# endif int64_T抵消= 0;int64_T位置= 0;

打开一个文件

读写打开一个文件,使用C / c++打开外部文件像平时一样的函数。只要你有包括在内io64.h在程序的开始,打开外部文件大文件的正常工作。任何更改要求从文件中读,写入文件,,fscanf,文件关闭

下面的语句打开一个已存在的文件以二进制模式用于读取和更新。

fp = fopen(文件名,“r + b”);如果(NULL = = fp){/ *文件不存在。创建新的文件编写*以二进制模式。* / fp = fopen(文件名,“世界银行”);如果(NULL = = fp) {sprintf (str,“未能打开/创建测试文件“% s”,文件名);mexErrMsgIdAndTxt (“MyToolbox: myfnc: fileCreateError”, str);返回;其他}{mexPrintf(“新创建的测试文件' % s ' \ n”,文件名);}}其他mexPrintf(“现有测试文件' % s ' \ n”打开,文件名);

打印格式的消息

你不能打印使用的64位整数% d转换说明符。相反,使用FMT64指定适当的格式为您的平台。FMT64在头文件中定义吗tmwtypes.h。下面的例子显示了如何打印一条消息显示一个大文件的大小:

ll int64_T large_offset_example = 9000222000;mexPrintf (FMT64“例大型文件大小:% d个字节。\ n”, large_offset_example);

替换fseekftell与64位的功能

ANSI®Cfseekftell64位文件I / O函数并不是能够在大多数平台上。的函数setFilePosgetFilePos然而,被定义为相应的POSIX®fsetposfgetpos(或fsetpos64fgetpos64)根据您的平台/操作系统。这些函数是64位的文件I / O可以在所有平台上。

下面的例子展示了如何使用setFilePos而不是fseek,getFilePos而不是ftell。本例使用getFileFstat找到文件的大小。然后使用setFilePos寻求结束的文件准备在文件的末尾添加数据。

请注意

虽然抵消参数setFilePosgetFilePos是一个指针指向一个签署了64位整数,int64_T,它必须投一个fpos_T *。的fpos_T中定义的类型是io64.h作为适当的fpos64_tfpos_t根据你的操作系统平台。

getFileFstat (fileno (fp) &statbuf);文件大小= statbuf.st_size;抵消=文件大小;setFilePos (fp (fpos_T *)抵消);getFilePos (fp (fpos_T *)和地位);

不像fseek,setFilePos金宝app只支持绝对寻求相对于文件的开始。如果你想做一个相对的寻求,首先调用getFileFstat获取文件大小。然后将相对偏移量转换为绝对抵消你能通过setFilePos

确定一个打开的文件的大小

得到一个打开文件的大小:

  • 刷新文件大小的记录存储在内存使用getFilePossetFilePos

  • 使用检索文件的大小getFileFstat

刷新文件大小记录

之前试图检索一个打开的文件的大小,首先刷新的记录文件大小驻留在内存中。如果你跳过这一步打开写一个文件,文件大小可能不正确或返回0。

刷新文件大小记录,寻求任何抵消在文件中使用setFilePos。如果你不想改变文件指针的位置,你可以寻求文件中的当前位置。本例中获取当前文件的抵消从一开始。然后寻求当前位置更新文件大小不移动文件指针。

getFilePos (fp (fpos_T *)和地位);setFilePos (fp (fpos_T *)和地位);

获取文件大小

getFileFstat函数接受一个文件描述符的输入参数。使用fileno函数打开文件的文件指针。getFileFstat返回文件的大小,以字节为单位st_size一个领域structStat结构。

structStat statbuf;int64_T文件大小= 0;如果(0 = = getFileFstat (fileno (fp) &statbuf)){文件大小= statbuf.st_size;mexPrintf(“文件大小是%”FMT64“\ n d字节”,文件大小);}

确定关闭的文件的大小

getFileStat函数接受一个封闭的文件的文件名作为输入参数。getFileStat返回文件的大小,以字节为单位st_size一个领域structStat结构。

structStat statbuf;int64_T文件大小= 0;如果(0 = = getFileStat(文件名,&statbuf)){文件大小= statbuf.st_size;mexPrintf(“文件大小是%”FMT64“\ n d字节”,文件大小);}