




已阅读5页,还剩64页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Ch18档案读写 张智星jang cs nthu edu twhttp www cs nthu edu tw jang清大资工系多媒体检索实验室 本章重点 MATLAB内建许多有关档案读写的函数对二进制档案或ASCII档案都可以进行处理开启关闭储存 高阶的档案读写指令 先列出常用读写档案指令 稍后将介绍用法 高阶的档案读写指令 cont csvread 使用csvread指令来读取条件 数据文件是由逗号分开只有包含数值资料Ex csvread01 m fprintf data csv的内容 n typedata csv 列出data csv的内容A csvread data csv 将data csv的内容读到矩阵A result data csv的内容 1 2 34 56 7 8 9A 123045006789csvread会传回一个数值矩阵其中缺席的资料将以0填入 dlmread 如果数值数据的分界符号 Delimiters 不是逗点 就不能使用csvread指令 而要改用dlmread指令Ex dlmread01 m fprintf data dlm的内容 n typedata dlm 列出data dlm的内容A dlmread data dlm t 将data dlm的内容读到矩阵A Result data dlm的内容 123456789A 123045006789上例中data dlm的数据是以定位键 Tab 隔开 因此dlmread指令的第二个自变量是 t 以代表定位键 textread 如果档案数据包含数值及字符串 我们就必须改用textread指令Ex textread01 m fprintf data txt的内容 n typedata txt 列出data txt的内容 name hobby age textread data txt s s d result data txt的内容 TimmyOnlineGames13AnnieChatrooms10RogerTennis41name Timmy Annie Roger hobby OnlineGames Chatrooms Tennis age 131041 在上述范例中 data txt包含三个字段 或是三直行的数据 textread可在第二个自变量指定数据型态例如上例中 s代表字符串 d代表整数也同时将读入的数据设定到不同的输出自变量由于数据型态的不同 输出自变量也有不同的型态以上述范例来说 name和hobby都是字符串异值数组 而age则是数值数组 使用定位键来分隔字段 上例中 我们利用空格来分隔字段如果字段值本身也有空格 改用定位键来分隔字段Ex textread02 m fprintf data2 txt的内容 n typedata2 txt 列出data2 txt的内容 name hobby age textread data2 txt s s d delimiter t result 结果与前一例相同textread指令中加上对分界字符 Delimiters 的定义 就可以读出由定位键所分隔的数据文件若不指定时 预设为空格键 读取文字文件 textread也可以读取一个文字文件同时把档案内的每一列文字变成字符串异质数组里面的每一个元素Ex textread03 m Contents textread textread03 m s delimiter n whitespace class contents 印出contents的数据类别contents 1 列出contents第一列contents 2 列出contents第二列 Result ans cellans contents textread textread03 m s delimiter n whitespace ans class contents 印出contents的数据类别上例使用textread读入textread03 m 也就是此范例档案 并显示此档案的第一列和第二列 textread指令的用法还有很多 功能也很强大在MATLAB下输入 helptextread 可以得到完整的技术支持 Fileread 若只是要将一个档案的内容送到一个字符串 可以使用fileread指令Ex 范例16 6 fileread01 m out fileread data2 txt class out size out Result ans charans 164上例中 fileread指令会将档案data2 txt的内容送到字符串变量outclass out 的值是char 显示out的数据型态是字符串size out 显示字符串out的长度是64 影像与音讯档案 有关于影像档案的读写 请参阅本书第十九章 影像显示与读写 有关音讯档案的读写 请参阅本书第二十章 音讯读写 录制与播放 更繁复的档案格式 一般情况下尽量采取先前介绍的指令来进行读写 数据格式比较繁复时需要一列一列读进来再进行剖析 Parsing 相关指令将在以下介绍 开启档案 无论读写ASCII或二进制档案 都必需先用fopen函数来开启档案 语法如 fid fopen filename permission 其中filename表示欲读写的文件名称permission则表示欲对档案进行的处理方式 可以是下列任一字符串 l r 只准读取 reading 档案l w 只准写入 writing 档案l a 只准加入 appending 档案l a 可读取及加入档案 readingandappending 省略第二个自变量 permission的默认值就是 r 有关fopen 在windows下 permission字符串必需能够分辨binary或ASCII档案 例如 若要读binary档案 则permission字符串必需是 rb fopen另外支持很多permission字符串 可输入 helpfopen 得到完整的信息 fopen函数传回一个档案辨识码 通常是个非负的整数 我们可用此辨识码来对此档案进行各种读写的处理 Ex fopen01 m 上例可知当档案不存在时 回传的fid是 1同时message会包含相关的错误信息 fid message fopen no such file r fprintf fid d n fid fprintf message s n message fid 1message Sorry Nohelpinfiguringouttheproblem Ex fopen02 m 若开启成功 则传回的fid是一个大于2的整数 而且传回的message是一个空字符串 例如 fid message fopen fopen02 m r fprintf fid d n fid fprintf message s n message fid 3message Tips fopen可传回第二个自变量来显示错误讯息 为了安全起见 最好在每次使用fopen时 都测试其传回的fid是否为有效值 MATLAB使用fid 1来代表 标准输出 StandardOutput fid 2代表 标准错误输出 StandardError 因此在使用这两个fid的值时 可以不必使用fopen来开启档案 关闭档案 完成档案的读写之后 可用fclose函数来关闭档案 用法如下 status fclose fid 若一切顺利 fclose传回0 若无法顺利关闭档案 则fclose传回 1 为避免因开启档案过多而造成系统资源浪费 一般在完成档案的读写后 即应使用fclose来关闭档案 Tips 若要一次关闭所有开启的档案 可用fclose all 或是fcloseall 开启及关闭档案都是比较耗时的函数 因此尽量不要将他们置于循环之中 以提高程序执行效率 读取ASCII档案 fgetl函数 可将ASCII档案的内容中的某一列读出并将该列的ASCII内容以转成字符串传回 Ex fgetl01 m fid fopen mean m r whilefeof fid 0 feof测试档案指针是否已到达结束位置line fgetl fid disp line end 读取ASCII档案 cont 执行上述程序后 MATLAB会 先在目前目录找寻mean m若找不到 再根据搜寻路径 找出mean m指令的位置然后再将其内容一列一列地列出 请自行动手试用此范例程序代码 输入 whichmean 可显示档案所在的路径fgets和fgetl均可由档案读取一列数据 fgetl会舍去换行字符fgets函数则保留换行字符 应用 仿真unix的grep指令 grep 用来找出包含某一特定字符串的一列 functiongrep filename pattern fid fopen filename r line number 0 whilefeof fid 0 line fgetl fid matched findstr line pattern if isempty matched fprintf d s n line number line endline number line number 1 endfclose fid result 如欲列出grep m中包含 matched 字符串的每一列 可输入如下 grep grep m matched 6 matched findstr line pattern 7 if isempty matched 若要进行更复杂的字符串比对例如要在一个档案中找出 b和d中间夹1至3个元音 的英文字请参考本书姊妹作 MATLAB程序设计 进阶篇 中的第四章 通用表达式 fscanf 函数fscanf可对ascii档案作更精确的读取 用法如下 matrix fscanf fid format 其中fid是欲读取之档案的辨识码format是格式指定字符串 FormatSpecifier 常用的格式指定字符串有下列几种 s 字符串 d 10进位的整数 g 双倍精准 Double precision 的浮点数 Floating pointNumbers 其它各种格式指定字符串可输入helpfscanf来得到详细的说明 Ex fscanf01 m 有一文字文件test txt如下 149162536496481100 欲使用fscanf指令读取其内容 可输入如下 fid fopen test txt r myData fscanf fid g fclose fid myData 显示myData result myData 149162536496481100 上例显示了MATLAB的fscanf指令和C的fscanf指令的最大不同 MATLAB的fscanf指令是向量化的 Vectorized 只要读入数据的型态正确 MATLAB的fscanf指令会一再执行同时把所得结果存放于一个向量并回传 sscanf sscanf函数和fscanf的功能很类似sscanf函数从字符串 Strings 中读取数据ex sscanf m str num2str pi sqrt 2 log10 3 建立一字符串strretrieved sscanf str g 撷取str中的double str 3 14161 41420 47712retrieved 3 14161 41420 4771 写入ASCII档案 fprintf函数可将数据依格式指定字符串来写入ASCII档案 其使用语法如下 fprintf fid format y 其中fid是欲写入之档案的辨识码format是格式指定字符串 用以指定数据写至档案的格式y是MATLAB的数据变量常用的格式指定字符串有下列几种 e 科学记号 即将数值表示成a 10b的形式 f 固定栏宽 含整数与小数部份 的表示法 g 自动选取 e或 f其它各种格式指定字符串可输入helpfprintf来得到详细的在线说明 应用 将平方根表写入档案 Ex fprintf01 m x 1 10 y x sqrt x fid fopen squareRootTable txt w fprintf fid Tableofsquareroot r n fprintf fid 2 0f 10 6f r n y fclose fid dos startsquareRootTable txt 开启squareRootTable txt Result 在上例中 2 0f印出的总栏宽为2 且不带小数 10 6f印出的总栏宽为10 包含6位的小数请自行试验后开启squareRootTable txt来验证 sprintf sprintf函数和fprintf函数的功能很类似sprintf将数据以字符串形式传回Ex str sprintf log f e n 2 log 2 str log 2 000000 6 931472e 001 暂存目录 在某些应用上 可能需要用到暂存目录及临时文件 欲取用系统的暂存目录 可用tempdir如下 directory tempdirResult directory C DOCUME 1 jang LOCALS 1 Temp 临时文件 欲开启一临时文件 可用tempname 如下 filename tempnameResult filename C DOCUME 1 jang LOCALS 1 Temp tp273132 Tips 不同系统下tempdir和tempname会依操作系统的环境变量而产生不同的回传字符串例如在Windows98操作系统下tempdir传回的字符串可能是 C windows temp tempname传回的字符串可能是 C WINDOWS TEMP tp512124 应用 产生暂存的HTML档案 以下利用tempname产生一个暂存的HTML档案 然后再将此档案显示在浏览器 Ex writeHTML m filename tempname html fid fopen filename w fprintf fid n fprintf fid ThisisatesthomepagewrittenbyMATLAB n fprintf fid fclose fid dos start filename 启动和 html相连结的应用程序 Result 上例产生之网页如下 当MATLAB的计算结果可用列表 Table 或多媒体档案 如影像 声音 动画等 来呈现时 由网页来显示这些结果是不错的选择 网络档案的读取 MATLAB也可以直接读取网络上的档案通常我们是采用URL UniversalResourceLocator 的方式来指定这些网络上的档案 一般网页 FTPftp urlread 上例中使用urlread指令来读取笔者在清华大学信息系的首页同时disp 将结果指定到字符串变量contents Ex urlread01 m contents urlread http www cs nthu edu tw jang disp contents Result Thelinkyoujustclickedisobsolete YouarebeingtransportedautomaticallytoRogerJang scurrenthomepageathttp neural cs nthu edu tw jang urlwrite urlwrite可以直接在读取网页后 就储存到本机硬盘中Ex urlread02 m tempFile tempname html 指定临时文件urlwrite tw tempFile 将网页内容写到档案dos start tempFile 开启此档案 Urlwrite cont 在上例中 我们将 tw的网页内容写到一个临时文件然后再使用浏览器开启此档案 另一个和网络相关的功能 sendmail可用来寄发电子邮件虽然这个功能和档案读写没有直接关系 但也在此一并说明 sendmail Sendmail指令的用法 sendmail TO SUBJECT MESSAGE ATTACHMENTS TO 收件者若是只有一位收件者 可用字符串表示若是有多位收件者 可以使用字符串异质数组来表示 SUBJECT 主题 以字符串表示 MESSAGE 电子邮件的内容 以字符串表示 ATTACHMENTS 附加档案 用异质数组来表示 Ex sendmail01 m 请将to的内容改为你自己本身的电子邮件 并试着执行一次 以确认此程序代码的正确性 to email1 aaa bbb ccc email2 aaa bbb ccc subject TestemailfromaMATLABprogram message Thisisatestemailsentviasendmail attachment c windows matlab ini sendmail to subject message attachment Tips 根据笔者在MATLAB6 5的测试 sendmail目前还不支持中文 以上范例纯粹以MATLAB6 5为主而MATLAB7 0对sendmail新增了一些新功能请输入helpsendmail来获取最新的在线支持 若要在邮件内容加入换列 可以使用ASCII码 10 例如 message Sir 10 Thisisatest 读取二进制数据 用fread函数可从档案中读取二进制数据fread会将每一个字节看成一个整数 并将结果以一矩阵传回 例如 档案test2 txt的内容如下 Thisisatest Ex fread01 m Result Thisisatest char可将myData的整数转成ASCII字符取myData的转制是为了使印出的效果易于阅读 fid fopen test2 txt r myData fread fid char myData 验证所读入的数据是否正确fclose fid Ex fread02 m fread函数可用第二个输入自变量来控制传回矩阵的大小 fid fopen test2 txt r myData fread fid 4 只读4个字节fclose fid myData 84104105115 Ex fread03 m Result myData 8410532104115105此时myData为2X3的矩阵 p s 上例中为长度4的向量 fid fopen test2 txt r myData fread fid 23 fclose fid Fread的第3个自变量 控制fread在将二进制数据转成MATLAB矩阵时所用的精确度包含 一次读取的位数 NumberofBits 这些位数所代表的数据型态常用的精准度有下列几种 Ex fread04 m Result myData 26708myData2 26708 fid fopen test2 txt r myData fread fid 1 short fclose fid myData2 bin2dec dec2bin abs h 8 dec2bin abs T 8 说明 fread04 m 上例将text2 txt以短整数的方式读入也就是以16bit为一个单位来转换成整数读出来的第一个数字 会等于将 h 和 T 转换成8bit 再并排成16bits然后再转换成十进制的整数值要注意的是 虽然原档案的前两个字节是 T 和 h 但是在以16bits为一个单位时 T 会是LSB LeastSignificantBits 而 h 则是MSB MostSignificantBits 因此我们再重组成16bits时 h 会在前而 T 会在后 写入二进制档案 fwrite函数 矩阵 二进制格式 写入档案传回成功写入的个数 以下用fwrite产生一大小为40bytes的二进制档案在使用type指令来显示档案内容时 看不到其内容因为是binary档案如果count的值小于10 就表示fread的运算有误Ex fwrite01 m fid fopen test bin w count fwrite fid randperm 10 int32 fclose fid typetest bin 控制档案位置指针 档案位置指针 决定下一次进行数据读取或写入的位置 控制此指针的函数如下 feof测试指针是否在档案结束位置fseek设定指针位置ftell取得指针位置frewind重设指针至档案起始位置 foef 测试指针是否在档案结束位置Ex feof01 m fid fopen test txt A fscanf fid g 34 feof fid 在上例中 feof fid 传回1 表示档案指针已经在档案结束位置因为test txt只包含10个数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 事假多长时间可解除劳动合同5篇
- 2025设备采购合同协议样本
- 2025合同续约期限
- 2025年安全工程师考试题库及答案
- 2025年安徽材料员考试及答案
- 2025年有疤痕的月亮试卷及答案
- 仓库打包运营方案范本
- 九龙湖花园施工方案公示
- 厂房物品清点方案范本
- 道德讲堂活动方案范本
- 《济南市城镇燃气领域重大隐患判定指导手册》
- 卢卡奇的《历史与阶级意识》
- JJG693-2011燃气泄漏检测仪器检定规程
- 三峡大学科技学院实习报告及实习成绩考核鉴定表模板
- 电缆电线技术标书
- 柔性压力传感器制备法
- 水稻高产栽培技术要点
- (免费分享)工商银行业务委托书打印版
- GB 5226.1-2008机械电气安全机械电气设备第1部分:通用技术条件
- 《毛泽东思想和中国特色社会主义理论体系概论》全套课件
- (完整)农村污水处理工程施工组织设计
评论
0/150
提交评论