在目标文件 filname 中,数 据是从第一行的第一列开始写的。输入的 filename 是使用单引号括起来的字符串。 2.dlmwrite(filename, M, 'D') 《Simulink 与信号处理》 将矩阵 M 写入一个 ASCII 格式的文件中,使用分隔符 D 来分割矩阵的元素。在目标文件 filname 中,数据是从第一行的第一列开始写的。逗号'是默认的分隔符,使用\t 来产生制 表符分割的文件。 3.dlmwrite(filename, M, 'D', R, C) 将矩阵 M 写入一个 ASCII 格式的文件中,使用分隔符 D 来分割矩阵的元素。在目标文件 filname 中,数据是从第 R 行的第 C 列开始写的,R 和 C 从 0 开始,因此 R=0,C=0 指定了文 件中的第一个数值,即左上角的位置。 5.dlmwrite(filename, M, '-append') 将矩阵数据追加到文件的末尾。如果你不指定''-append',dlmwrite 覆盖文件中的任何 现有数据。 Xlswrite: xlswrite(filename,A) xlswrite(filename,A,sheet) xlswrite(filename,A,range) xlswrite(filename,A,sheet,range) status = xlswrite(filename,A,sheet,range) [status,msg] = xlswrite(filename,A,sheet,range) xlswrite(filename, M) 将矩阵 M 的数据写入名为 filename 的 Excel 文件中。 xlswrite(filename, M, sheet) 将矩阵 M 的数据写入文件名为 filename 中的指定的 sheet 中。 xlswrite(filename, M, range) 将矩阵 M 中的数据写入文件名为 filename 的 Excel 文件中,且由 range 制定存储的区域,例 如'C1:C2'. xlswrite(filename, M, sheet, range) 在上一条命令的基础上指定了所要存储的 sheet。 status = xlswrite(filename, ...) 返回完成状态值。如果写入成功,则 status 为 1;反之写入失败,则 status 为 0. xlswrite('testdata.xls', [12.7 5.02 -98 63.9 0 -.2 56]) d = {'Time', 'Temp'; 12 98; 13 99; 14 97}; s = xlswrite('tempdata.xls', d, 'Temperatures', 'E1') s= 1 Time Temp 12 98 13 99 14 97 附录一:文件的打开写入 fid=fopen(文件名,‘打开方式’) 说明:其中 fid 用于存储文件句柄值,如果返回的句柄值大于 0,则说明文件打开成功。文件名用字符串形 式,表示待打开的数据文件。常见的打开方式如下: λ ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。 λ ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。 λ ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。 λ ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。 λ ‘a’:在打开的文件末端添加数据。文件不存在则创建。 λ ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。 另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以 二进制格式打开,这也是 fopen 函数默认的打开方式。 2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用 fclose 函数,调用格式为: sta=fclose(fid) 说明:该函数关闭 fid 所表示的文件。sta 表示关闭文件操作的返回代码,若关闭成功,返回 0,否则返回-1。 如果要关闭所有已打开的文件用 fclose(‘all’)。 2、二进制文件的读写操作 1)写二进制文件 fwrite 函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为: COUNT=fwrite(fid,A,precision) 说明:其中 COUNT 返回所写的数据元素个数(可缺省),fid 为文件句柄,A 用来存放写入文件的数据,precision 代表数据精度,常用的数据精度 有:char、uchar、int、long、float、double 等。缺省数据精度为 uchar, 即无符号字符格式。 例 6.8 将一个二进制矩阵存入磁盘文件中。 >> a=[1 2 3 4 5 6 7 8 9]; >> fid=fopen('d:\test.bin','wb') %以二进制数据写入方式打开文件 fid = 3 %其值大于 0,表示打开成功 >> fwrite(fid,a,'double') ans = 9 %表示写入了 9 个数据 >> fclose(fid) ans = 0 %表示关闭成功 2)读二进制文件 fread 函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为: [A,COUNT]=fread(fid,size,precision) 说明:其中 A 是用于存放读取数据的矩阵、COUNT 是返回所读取的数据元素个数、fid 为文件句柄、size 为 可选项,若不选用则读取整个文件内容;若选 用则它的值可以是下列值:N(读取 N 个元素到一个列向量)、 inf(读取整个文件)、[M,N](读数据到 M×N 的矩阵中,数据按列存放)。 precision 用于控制所写数据的 精度,其形式与 fwrite 函数相同。 3、文本文件的读写操作 1)读文本文件 fscanf 函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为: [A,COUNT]=fscanf(fid,format,size) 说明:其中 A 用来存放读取的数据,COUNT 返回所读取的数据元素个数,fid 为文件句柄,format 用来控制 读取的数据格式,由%加上格式符组成,常 见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字 符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等。size 为可 选项,决定矩阵 A 中数据的排列形式,它可以取下列值:N(读取 N 个元素到一个列向量)、inf(读取整个文件)、[M,N] (读数据到 M×N 的矩阵中,数 据按列存放)。 2)写文本文件 fprintf 函数可以将数据按指定格式写入到文本文件中。其调用格式为: fprintf(fid,format,A) 说明:fid 为文件句柄,指定要写入数据的文件,format 是用来控制所写数据格式的格式符,与 fscanf 函数 相同,A 是用来存放数据的矩阵。 例 6.9 创建一个字符矩阵并存入磁盘,再读出赋值给另一个矩阵。 >> a='string'; >> fid=fopen('d:\char1.txt','w'); >> fprintf(fid,'%s',a); >> fclose(fid); >> fid1=fopen('d:\char1.txt','rt'); >> fid1=fopen('d:\char1.txt','rt'); >> b=fscanf(fid1,'%s') b= string matlab 读 txt 文件 fid=fopen('fx.txt','r'); %得到文件号 [f,count]=fscanf(fid,'%f %f',[12,90]); %把文件号 1 的数据读到 f 中。其中 f 是[12 90]的矩阵 %这里'%f %f'表示读取数据的形势,他是按原始数据型读出 fclose(fid); %关闭文件 另外有的 txt 文件还可以用 load 来打开 其语句为 f=load('fx.txt) 我个人觉得用第一种方式较好。因为有些时候,特别是 fx.txt 的一行种有多个数据时用 load 就比较麻烦了。 附录三:textread 的四个例子 示例 1 - 阅读所有字段格式文件使用% mydata.dat 在第一行是 Sally Level1 12.34 45 Yes 阅读作为一个自由格式文件的第一行使用% 。 [names, types, x, y, answer] = textread('mydata.dat', ... '%s %s %f %d %s', 1) 返回 names = 'Sally' types = 'Level1' x= 12.34000000000000 y= 45 answer = 'Yes' 例 2 - 读为固定格式的文件,无视浮点值 mydata.dat 在第一行是 Sally Level1 12.34 45 Yes book.iLoveMatlab.cn 阅读作为一个固定格式的文件的文件的第一行,忽略了浮点值。 [names, types, y, answer] = textread('mydata.dat', ... '%9c %6s %*f %2d %3s', 1) 返回 names = Sally types = 'Level1' y= 45 answer = 'Yes' %*在格式化字符串 f 原因 textread 忽略浮动点值,在这种情况下,12.34。 示例 3 - 阅读用文字来忽略匹配字符 mydata.dat 在第一行是 Sally Type1 12.34 45 Yes 阅读文件的第一行,忽略第二个字段中的字符类型。 [names, typenum, x, y, answer] = textread('mydata.dat', ... '%s Type%d %f %d %s', 1) 返回 names = 'Sally' typenum = 1 x= 12.34000000000000 y= 45 answer = 'Yes' 键入%? 在格式字符串中的字符会导致第二个字段类型被忽略,而第二个字段的其余部分作 为一个符号整数读在这种情况下,1。 例 4 - 指定值填充空单元格 对于空单元文件,使用 emptyvalue 参数。假设该文件 data.csv 包含: 1,2,3,4,,6 7,8,9,,11,12 阅读文件使用 NaN 填补任何空白单元格: data = textread('data.csv', '', 'delimiter', ',', ... 'emptyvalue', NaN); 附录四: textscan 9 个例子 示例 1 - 读一字符 阅读下面的字符串,每个值截断到一个小数位。该说明符%*LD 告诉 textscan 跳过其余数字: str = '0.41 8.24 3.57 6.24 9.27'; C = textscan(str, '%3.1f %*1d'); textscan 返回一个 1 * 1CELL 阵列 ?: C{1} = [0.4; 8.2; 3.5; 6.2; 9.2] 例 2 - 读不同类型的数据 使用文本编辑器,创建一个文件 scan1.dat,其中包含下列表格数据: 09/12/2005 Level1 12.34 45 1.23e10 inf Nan Yes 5.1+3i 10/12/2005 Level2 23.54 60 9e19 -inf 0.001 No 2.2-.5i 11/12/2005 Level3 34.90 12 2e5 10 100 No 3.1+.1i 打开文件,读每列适当的转换说明符: fid = fopen('scan1.dat'); C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s %f'); fclose(fid); textscan 返回一个 1 - 9 CELL 排列如下 ?: C{1} = {'09/12/2005'; '10/12/2005'; '11/12/2005'} class cell C{2} = {'Level1'; 'Level2'; 'Level3'} class cell C{3} = [12.34; 23.54; 34.9] class single C{4} = [45; 60; 12] class int8 C{5} = [4294967295; 4294967295; 200000] class uint32 C{6} = [Inf; -Inf; 10] class double C{7} = [NaN; 0.001; 100] class double C{8} = {'Yes'; 'No'; 'No'} class cell C{9} = [5.1+3.0i; 2.2-0.5i; 3.1+0.1i] class double 前两个因素的 C(5)是一个 32 位无符号整数,或 intmax 的最高值('uint32')。 例 3 - 删除一个文字串 删除文本''Level' 从每场从例 2 的第二列的数据: fid = fopen('scan1.dat'); C = textscan(fid, '%s Level%u8 %f32 %d8 %u %f %f %s %f'); fclose(fid); textscan 返回一个 1 - 9CELL 阵列,C,与 C{2} = [1; 2; 3] class uint8 示例 4 - 跳过一行的剩余 阅读中的示例 2 文件中的第一列到一个单元格数组,跳过该行的其余部分: fid = fopen('scan1.dat'); dates = textscan(fid, '%s %*[^\n]'); fclose(fid); textscan 返回一个 1 * 1 电 CELL 阵列 dates: dates{1} = {'09/12/2005'; '10/12/2005'; '11/12/2005'} 例 5 - 指定分隔符和空值转换 使用文本编辑器,创建一个以逗号分隔的文件,其中包含 data.csv 1, 2, 3, 4, , 6 7, 8, 9, , 11, 12 阅读文件,转换空 CELL- INF 文件: fid = fopen('data.csv'); C = textscan(fid, '%f %f %f %f %u32 %f', 'delimiter', ',', ... 'EmptyValue', -Inf); fclose(fid); textscan 返回一个 1 - 6 细 CELL 排列如下 ?: C{1} = [1; 7] class double C{2} = [2; 8] class double C{3} = [3; 9] class double C{4} = [4; -Inf] class double (empty converted to -Inf) C{5} = [0; 11] class uint32 (empty converted to 0) C{6} = [6; 12] class double textscan 转换为空值在 C(4),与一个浮点格式,到 Inf 文件。由于 MATLAB 的代表无符号整数 为 0 Inf 文件,textscan 转换在 C(5)0 空值,而不是- INF 文件。 例如 6 - 使用自定义空值字符串和评论 使用文本编辑器,创建一个以逗号分隔的文件包含的行 data2.csv abc, 2, NA, 3, 4 // Comment Here def, na, 5, 6, 7 指定输入 textscan 应视为 comments 或空值: 《Simulink 与信号处理》 fid = fopen('data2.csv'); C = textscan(fid, '%s %n %n %n %n', 'delimiter', ',', ... 'treatAsEmpty', {'NA', 'na'}, ... 'commentStyle', '//'); fclose(fid); textscan 返回以下 1 × 5 单元阵列 ?: C{1} = {'abc'; 'def'} C{2} = [2; NaN] C{3} = [NaN; 5] C{4} = [3; 6] C{5} = [4; 7] www.iLoveMatlab.cn 例 7 - 处理重复分隔符 使用文本编辑器,创建一个文件包含 data3.csv 1,2,3,,4 5,6,7,,8 要当作一个逗号分隔的重复,使用 MultipleDelimsAsOne 参数为 1 的值: fid = fopen('data3.csv'); C = textscan(fid, '%f %f %f %f', 'delimiter', ',', ... 'MultipleDelimsAsOne', 1); fclose(fid); textscan 返回下面的 CELL 与一个 1 - 4CELL 阵列 ?: C{1} = [1; 5] C{2} = [2; 6] C{3} = [3; 7] C{4} = [4; 8] 例 8 - 使用 CollectOutput 开关 使用文本编辑器,创建一个文件包含 grades.txt Student_ID | Test1 | Test2 | Test3 1 91.5 89.2 77.3 2 88.0 67.8 91.0 3 76.3 78.1 92.5 4 96.4 81.2 84.6 为 CollectOutput 开关的默认值是 0(假),并 textscan 回报每一个单独的 数组中 的 数值数据 列: fid = fopen('grades.txt'); % read column headers C_text = textscan(fid, '%s', 4, 'delimiter', '|'); % read numeric data C_data0 = textscan(fid, '%d %f %f %f') C_data0 = [4x1 int32] [4x1 double] [4x1 double] [4x1 double] CollectOutput 设置为 1(真),收集同一类(考试成绩,这是所有双连续列)合并为一个数组: frewind(fid); C_text = textscan(fid, '%s', 4, 'delimiter', '|'); C_data1 = textscan(fid, '%d %f %f %f', ... 'CollectOutput', 1) C_data1 = [4x1 int32] [4x3 double] fclose(fid); 例 9 - 使用非默认控制字符 当你指定的任何参数值如下转义序列一,textscan 该序列转换为相应的控制字符: b Backspace 退格 \n Newline 换行符 \r Carriage return r 回车 \t Tab 制表 \\ Backslash (\) 反斜杠(\) 如果您的数据 使用不同的控制字符,使用 sprintf 函数中 显式地转换 您的 转义序列 textscan。 例如,下面的字符串包括一个换页字符,\F: lyric = sprintf('Blackbird\fsinging\fin\fthe\fdead\fof\fnight'); 读取字符串使用 textscan,调用 sprintf 函数的形式来明确转换 : C = textscan(lyric, '%s', 'delimiter', sprintf('\f')); textscan 返回一个 1 * 1CELL 阵列 ?: C{1} = {'Blackbird'; 'singing'; 'in'; 'the'; 'dead'; 'of'; 'night'} 例如 10 - 恢复文本字符串扫描 如果您恢复通过调用同一文件标识符器(FID)textscan 一个文本文件的扫描,自动恢复 textscan 在 终止了上一次读取读数。 如果你的输入是一个字符串,而不是一个文件,textscan 读取字符串的每次开始。为了恢复 扫描字符串中的任何其他位置,您必须使用您的初始调用两个输出参数语法 textscan。例如, 给定的字符串 lyric = 'Blackbird singing in the dead of night' 读取字符串的第一个字: [firstword, pos] = textscan(lyric,'%9c', 1); 返回扫描: lastpart = textscan(lyric(pos+1:end), '%s'); 涉及到的表格 表格一 格式 作用 输出 文字 (普通字 符) 忽略匹配的字符。例如,在一个已经由一个'Dept' 部数目(后文件),跳过 None 部和只读的数量,格式字符串在使用''Dept' 。 %d 阅读符号整数的值。 Double array %u 阅读 整数值。 Double array %f 读取浮点值。 Double array %s 阅读空白或分隔符分隔的字符串。 Cell array of strings %q 读取一个双引号的字符串,忽略引号。 Cell array of strings %c 读字符,包括空格。 Character array %[...] 阅读最长的字符串,其中包含在括号内指定的字符。 Cell array of strings %[^...] 最长的非空字符串读取 未包含在括号中指定的字符。 Cell array of strings 表格二 数值类型 Integer, signed Integer,unsigned 浮点数 转变 %d or %i %ld or %li %hd or %hi %u %o %x %X %lu %lo %lx or %lX %hu %ho %hx or %hX %f book.iLoveMatlab.cn %e %E %g %G %bx or %bX 详情 Base 10 values 64-bit base 10 values 16-bit base 10 values Base 10 Base 8 (octal) Base 16 (hexadecimal), lowercase letters a–f Same as %x, uppercase letters A–F 64-bit values, base 10, 8, or 16 16-bit values, base 10, 8, or 16 定点表示法 指数符号,如 3.141593e +00 同为%e,但大写,如 3.141593E +00 更紧凑的%e 或%F,没有尾随零 更紧凑的%E 或%F,没有尾随零 双精度十六进制,八进制或十进制值 1.字符 %bo %bu %tx or %tX %to %tu %c %s 例如%bx pi 打印为 400921fb54442d18 皮 单精度十六进制,八进制或十进制值 例如:%tx 的圆周率打印为 40490fdb 单个字符 字符串中的字符