下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、怎样使用TXT 文本文件进行数据存取由于大家在I/O 存取上以txt 文件为主,且读取比存储更麻烦(存储的话fwrite, fprintf 基本够用),因此下面的讨论主要集中在“txt 文件的读取”上。除了标注了“转”之外,其余心得均出于本人经验之结果,欢迎大家指正、补充。基本知识二进制文件与文本文件的区别将文件看作是由一个一个字节(byte) 组成的,那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着, 第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是
2、二进制文件也好,还是文本文件也好,都是一连串的0 和 1,但是打开方式不同, 对于这些0 和 1 的处理也就不同。如果按照文本方式打开,在打开的时候会进行 translate , 将每个字节转换成ASCII 码, 而以按照二进制方式打开的话,则不会进行任何的translate ;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如, 你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte) ;而对二进制文件进行编辑的话,最小单位则是位(bit) ,当然我们都不会直接通过手工的方式对二进制文件进行编辑了。从文件编码的方式来看,文件可分为ASCII 码文件和二进制码文
3、件两种:ASCII 文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII 码。例如,数5678的存储形式为:ASCII 码: 00110101001101100011011100111000进制码共占用 4 个字节。 ASCII 码文件可在屏幕上按字符显示,例如源程序文件就是ASCII 文件,用DOS命令TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。二进制文件是按二进制的编码方式来存放文件的。例如, 数 5678的存储形式为:0001011000101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文
4、件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号( 如回车符 ) 的控制。因此也把这种文件称作“流式文件”。文本模式(textmode) 和二进制模式(binarymode) 有什么区别?流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“n”,(如果以"文本"方式打开一个文件, 那么在读字符的时候,系统会把所有的"rn" 序列转成"n" , 在写入时把 "n" 转成 "rn" )。
5、二进制流是非解释性的,一次处理一个字符,并且不转换字符。注:n 一般会操作系统被翻译成" 行的结束 " ,即 LF(Line-Feed)r 会被翻译成" 回车 " ,即 CR(Cariage-Return)对于文本文件的新行,在 UNIX上,一般用 n(LF) 来表示,Mac上用r(CR)来表示Windows上是用 nr(CR-LF) 来表示。通常, 文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件( 例如图形或字处理文档 ) ,或者读取鼠标输入,或者读写调制解调器。如果用文本方式打开二进制文件
6、,会把“0D0A”自动变换成“n”来存在内存中。写入的时候反向处理。而二进制方式打开的话,就不会有这个过程。但是,Unicode/UTF/UCS格式的文件,必须用二进制方式打开和读写。上述基础其实大可以略过,简言之, 对用户来说:在 matlab 中存储成为二进制还是文本文件取决于fopen 的方式,如果用wt,则存储为文本文件,这样用记事本打开就可以正常显示了;如果用 w则存储为二进制文件,这样用记事本打开会出现小黑方块,要正常显示的话,可以用写字板或UltraEdit 等工具打开。Matlab 的 I/O 文件操作使用技巧和总结Matlab 支持的 I/O 文件(对应“取 /存”操作)类型
7、 :所有文件I/O 程序不需要特殊的工具箱。注:从上表可以看到,matlab 不支持 doc 格式的文档存取(因为doc 文档包含很多格式控制符),请改用txt 或者 dat 格式Matlab 的 I/O 文件指南以下是部分对应的中文译文:本技术支持指南主要处理:ASCII, binary, and MAT files.要得到MATLAB中可用来读写各种文件格式的完全函数列表, 可以键入以下命令:help iofunMATLAB中有两种文件High level routines:只需要少量的编程。Low level routines:程。High level routines 需要少量的编程。
8、I/O 程序: high level and low level. 包括现成的函数,可以用来读写特殊格式的数据,并且可以更加灵活的完成相对特殊的任务,需要较多的额外编包括现成的函数,可以用来读写特殊格式的数据,并且只举个例子,如果你有一个包含数值和字母的文本文件( text file ) 想导入MATLA,B你可以调用一些low level routines 自己写一个函数,或者是简单的用TEXTREAD函数。使用 high level routines 的关键是:文件必须是相似的(homogeneous),换句话说,文件必须有一致的格式。下面的段落描述一些high level file I/
9、Oroutines 并给出一些例子帮助理解概念。LOAD/SAVE主要的 high level file I/O routines是 LOAD和 SAVE函数。LOAD可以读 MAT-file data 或者用空格间隔的格式相似的ASCII data. SAVE 可以将MATLAB变量写入MAT-file 格式或者空格间隔的ASCII data。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的ASCII file sample_file.txt :1 5 4 16 85 43 2 6 86 8 4 32 190 7 8 7 65 9 81 2 3Example:用 LOAD and
10、SAVE 读写数据CODE:% Load the file to the matrix, M :M = load('sample_file.txt')% Add 5 to M :M = M +5% Save M to a .mat file called 'sample_file_plus5.mat':save sample_file_plus5 M% Save M to an ASCII .txt file called 'sample_file_plus5.txt' :save sample_file_plus5.txt M -asciiUI
11、GETFILE/UIPUTFILEUIGETFILE/UIPUTFILE是基于图形用户界面(GUI)的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。UIGETFILE让你选择一个文件来写(类似 Windows另存为选项?)。用UIGETFILE,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。Example:用 UIGETFILE 从当前目录选择一个M-fileCODE:% This command lists all the M-files in the current directory and% returns the name and
12、 path of the selected filefname,pname = uigetfile('*.m','Sample Dialog Box')注意 : UIGETFILE 一次只能选择一个文件。UIIMPORT/IMPORTDATAUIIMPORT是一个功能强大,易于使用的基于GUI的 high level routine ,用于读 complex data files 。文件也必须是homogeneous。IMPORTDAT形成 AUIIMPORT的功能,不打开GUI。 可以将IMPORTDAT用于函数或 A者脚本中,因为在函数或者脚本中基于GUI的
13、文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件'sample_file2.txt' :This is a file header.This is file is an example.col1 col2 col3 col4A14612.000B14613.000C14614.000D14615.000Example: Using IMPORTDATtoA read in a file with headers, text, and numeric dataCODE:% This reads in the file 'sample_file2.t
14、xt' and creates a% structure D that contains both data and text data.% Note the IMPORTDATA command specifies a white space% as the delimiter of the file, but IMPORTDATA can usually% detect this on its ownD = importdata('sample_file2.txt','')% 原文有误?D = importdata('sample_file2
15、.txt')可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入:data = D.datatext = D.textdata可以用UIIMPORT读同一个文件并得到同样的结构.注意 : 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。TEXTREAD/STRREADTEXTREAD是一个强大的动态high level routine ,设计用来读ASCII 格式的文本和 / 或数值数据文件。STRREAD除是从字符串而不是文件读以外,类似于TEXTREA。D两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一
16、个“两全其美”的方法,因为他们可以用一个命令读入混合的 ASCII 和数值数据( high level routines 的做法) , 并且你可以改变他们以匹配你特定的应用(如同 low level routines 做到的)。例子:CODE:Example 1: Using TEXTREAD to read in an entire file into a cell array% This command reads in the file fft.m into the cell array, file file = textread('fft.m','%s'
17、,'delimiter','n','whitespace','');CODE:Example 2: Using STRREAD to read the words in a line% This command uses the cell array created in Example 1 to% read in each word of line 28 in 'file' to a cell array, wordswords = strread(file28,'%s','delimit
18、er','')CODE:Example 3: Using TEXTREAD to read in text and numeric data from a file with headers% This command skips the 2 header lines at the top of the file% and reads in each column to the 4 specified outputsc1c2c3c4=textread('sample_file2.txt','%s %s %s %s','header
19、lines',2)CODE:Example 4: Using TEXTREAD to read in specific rows of text and numeric data from a file% This command reads in rows B and C of the file. The 'headerlines'% property is used to move down to the desired starting row and the% read operation is performed 2 timesc1 c2 c3 c4 = te
20、xtread('sample_file2.txt',.'%s %s %s %s',2,'headerlines',4)CODE:Example 5: Using TEXTREAD to read in only the numeric data from a file containing text and numbers% This command reads in only the numeric data in the file. The% 'headerlines' property is used to move dow
21、n to the first row% of interest and the first column of text is ignored with the% '*' operatorc2c3c4=textread('sample_file2.txt','%*s %d %d %f','headerlines',3)DLMREAD/DLMWRITE/CSVREADDLMREAD和 DLMWRITE函数能够读写分隔的ASCII data ,而不是用low levelroutines 。他们比low level routines 容
22、易使用,Low level routines 用几行代码实现的功能可以用DLMREAD/DLMWR简化成一行。ITECSVREA用来读分隔符是逗号的文件,是DDLMREA的特殊情况。当读空格和DTab分隔的电子数据表文件时,DLMREA特别有用。以D'sample_file.txt' 为例:CODE:Example 1: Using DLMREAtDo read in a file with headers, text, and numeric data% This reads in the file 'sample_file2.txt' and creates
23、 a matrix, D,% with the numeric data this command specifies a white space as the% delimiter of the fileD = dlmread('sample_file.txt','')CODE:Example 2: Using DLMREAtDo extract the first 3 columns of the last 3 rows % This reads in the first 3 columns of the last 3 rows of% the data f
24、ile 'sample_file.txt'into the matrix, D_partial.% 读文件 'sample_file.txt' 前 3 列后 3 行,到矩阵D_partial.D_partial = dlmread('sample_file.txt','',2 0 4 2)CODE:Example 3: Using DLMWRITE to write a comma delimited file% This creates a file called 'partialD.txt' that cons
25、ists of% the first 3 columns of the last 3 rows of data where each% element is separated by a commadlmwrite('partialD.txt',D_partial,',')注意 : 保证 DLMREAaDn d DLMWRIT指定范围的指标从E0开始,而不是从1 开始。WK1READ/WK1WRITEWK1READ用来读Lotus123 电子数据表文件的数据;WK1WRITE用来写矩阵到Lotus123 电子数据表文件。XLSREADXLSREAD用来读Exce
26、l 的数值和文本数据。具体例子分析Matlab 网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了:1. 纯数据(列数相同):源文件:CODE:0 3866.162 2198.938 141.1401 3741.139 2208.475 141.2522 3866.200 2198.936 141.1563 3678.048 2199.191 141.2304 3685.453 2213.726 141.2615 3728.769 2212.433 141.2776 3738.785 2214.3
27、81 141.2567 3728.759 2214.261 141.2288 3748.886 2214.299 141.2439 3748.935 2212.417 141.25310 3733.612 2226.653 141.23611 3733.583 2229.248 141.22312 3729.229 2229.118 141.186解答:对于这个txt 文件,由于各行列数相同,故简单地使用load,importdata均可。2. 字段名(中、英文字段均可)+数据:源文件:CODE:CH0 CH1 CH2 CH30.000123 0.000325 0.000378 0.00059
28、80.000986 0.000256 0.000245 0.000698解答: 由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或NaN),故直接使用importdata 便可。3. 注释(含有独立的数字串)+数据(列数相同):问题:这个文件有4 列 , 但前 6 行是文字说明,4 列数字是从第8 行开始的. 现在我想把这个文件的前2 列和文字说明提出来组成一个新的dat 文件源文件:CODE:Group 212.02.2006 LimeiSamples of datas: 50000CH0 CH1 CH2 CH30.0001230.0003250.0003780
29、.0005980.0009860.0002560.0002450.000698目标文件:CODE:Group 2 12.02.2006 LimeiSamples of datas: 50000CH0 CH10.000123 0.0003250.000986 0.000256解答:由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用importdata, load 等高级命令直接读取会失败,用textread, dlmwrite 等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释 部 分 直 接 用 高 级 命 令 读 取 数 据 , 即 : a b c d
30、=textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的读取方法如下:CODE:clc;clear;fid = fopen('exp.txt', 'r');fid_n=fopen('ex.dat','w');while feof(fid)tline=fgetl(fid);if isempty(tline)if double(tline(1)>=48 && double(tline(1)<=57
31、%数值开始a=strread(tline);a(3:4)=;fprintf(fid_n,'%f %fn',a);clear a;elseif double(tline(1)=67%字母C开始b1,b2,b3,b4=strread(tline,'%s %s %s %s');b=b11,'',b21;fprintf(fid_n,'%sn',b);clear b b1 b2 b3 b4;elsefprintf(fid_n,'%sn',tline);endelsefprintf(fid_n,'%sn',tl
32、ine);endend fclose(fid); fclose(fid_n);4. 注释(不含独立的数字串)+数据(列数相同):源文件:CODE:你好 abc欢迎来到我们振动论坛1 11 111 11112 22 222 22223 33 333 33334 44 444 44445 55 555 5555解答:直接用importdata 便可注: 有时候注释中含有独立的数字串也可以importdata 成功, 不过得到的结果有可能不正确,建议这时候使用第3 种情形的读取方式。5. 注释与数据混排:对此当然只能自己编程,举例:源文件:CODE:1 11 111 1111你好2 22 222 2222欢迎来到3 33 333 3333振动论坛4 44 444 44445 55 555 5555解答:CODE:function data=distilldata(infile)%功能说明:%将保存数据的原始文件中的数值数据读入到一个data 变量中%使用说明:% infile 原始数据文件名 ;% data=数据变量tmpfile='tmp2.mat'fidin=fopen(infile,'r'); %打开原始数据文件(.list )fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年全球及中国人体工学靠垫行业头部企业市场占有率及排名调研报告
- 2025-2030全球水处理用复合管行业调研及趋势分析报告
- 2025-2030全球呼吸道药物吸入器行业调研及趋势分析报告
- 2025-2030年中国异型毛毡垫行业深度研究分析报告
- 壁球、手球用品行业市场发展及发展趋势与投资战略研究报告
- 塑料合金项目可行性研究报告建议书
- 燃气管网建设项目申请报告可行性研究报告
- 2025-2030年中国塑料助济行业深度研究分析报告
- 2025年度智慧社区供水供电及服务合同范本
- 2025年度跨境电商贸易融资合同范例
- 中国储备粮管理集团有限公司兰州分公司招聘笔试真题2024
- 第1课 隋朝统一与灭亡 课件(26张)2024-2025学年部编版七年级历史下册
- 提高金刚砂地坪施工一次合格率
- 【历史】唐朝建立与“贞观之治”课件-2024-2025学年统编版七年级历史下册
- 产业园区招商合作协议书
- 2024年广东省公务员录用考试《行测》真题及答案解析
- 2025新译林版英语七年级下单词默写表
- 盾构标准化施工手册
- 天然气脱硫完整版本
- 中欧班列课件
- 2025届高三数学一轮复习备考经验交流
评论
0/150
提交评论