1、第八章 输入/输出函数38.1 函数textread38.2 关于load和save命令的进一步说明48.3 MATLAB文件过程简介58.4 文件的打开与关闭68.4.1 fopen函数68.4.2 fclose函数88.5 二进制I/O函数88.5.1 fwrite函数88.5.2 fread函数9例8.1 读写二进制数据9测试8.1118.6 格式化I/O函数118.6.1 fprint函数118.6.2 格式转换指定符的理解128.6.3 如何使用格式字符串14例8.2 产生一个信息表158.6.4 fscanf函数168.6.5 fgetl函数178.7 格式化和二进制I/O函数的比
2、较17例8.3 格式化和二进制I/O文件的比较18测试8.2208.8 文件位置和状态函数218.8.1 exist函数21例8.4 打开一个输出文件218.8.2 函数ferror238.8.3 函数foef238.9 函数uiimport278.10 总结298.10.1 好的编程习惯总结298.10.2 MATLAB总结308.11 练习308.1308.2308.3318.4318.5318.6318.7318.8318.9328.10328.11328.12328.1332第八章 输入/输出函数在第二章中,我们已经学到如何用load和save命令加载和保存MATLAB数据,以及如何使
3、用fprintf函数格式化输出数据。在本章中,我们将学习更多的关于MATLAB输入和输出的功能。首先,我们将会学习函数textread,在maltab5。3中它是一个非常有用的函数。然后,我们将花更多的时间学习load和save命令。最后,我们将查看其他的MATLABI/O选择。熟悉C语言的读者对这部分数据将会十分的熟悉。但是,在MATLAB函数和c函数之间有细微的不同。8.1 函数textread命令textread最早出现于MATLAB5.3中。它可以按列读取ascii文件中的元素,每一列中可能含有不同的数据类型。这函数读取其他程序生成的数据表时非常地有用。这个命令的形式如下a, b, c
4、, . = textread(filename, format, n)其中filename代表要打开的文件的名字,format是用于每一行数据类型的字符串,n代表要读取的行数(如果没有n,则这个命令将读完这个文件)。格式化字符串与函数fprintf格式化描述的字符串相同。注意输出参数的个数必须与你读取的列数相区配。例如,假设文件test_input.dat包含下列数据James Jones O+ 3.51 22 YesSally Smith A+ 3.28 23 NO这些数据用下面的函数读取一系列的数组。first, last, blood, gpa, age, answer = textre
5、ad(test_input.dat,%s %s %s %f %d %s)当这个函数被编译时产生如下结果 first, last, blood, gpa, age, answer = textread(test_input.dat,%s %s %s %f %d %s)first = James Sallylast = Jones Smithblood = O+ A+gpa = 3.5100 3.2800age = 22 23answer = Yes NO这个函数可以通过在格式描述符前面加一个星号的方式来跳过某些所选项。例如,下面的语句只从文件只读取first,last和gpa。 first, l
6、ast, gpa = textread(test_input.dat,%s %s %*s %f %*d %*s)first = James Sallylast = Jones Smithgpa = 3.5100 3.2800函数textread要比load命令简单有效的多。load命令假设输入文件中的所有数据都是同一类型它不支持在不同的列上有不同的数据。此外,它把所有的数据都存储在一个数据中。相反地,函数textread允许每一列都有独立的变量,当和由不同类型的数据组成的列运算时,它更加的方便。函数textread中有许许多多参数,它们增加了函数的灵活性。你可通过咨询MATLAB的在线文本得到
7、这些参数的使用细节。常见编程错误应用函数text从ascii文件中按行格式读取数据,这个ascii文件可能是其他语言生成的,或是由其他的应用程序生成的,例如表格。8.2 关于load和save命令的进一步说明save命令把MATLAB工作区数据存储到硬盘,load命令把硬盘上的数据拷贝到工作区中。save命令即可用特殊的二进制格式matfile存储数据,也可用普通的ascii码格式存储数据。save命令的形式为save filename list of variables options如果只有save命令,那么当前工作区内的所有数据存储在一个名为matlab.mat的文件中。如果后面有一个文
8、件名,那么这些数据将会存储在“filename.mat”的文件。如果后面还包括一系列的变量,那么就只存储这些特殊的变量。支持save命令的参数如表8.1所示。表8.1save命令的参数参数描述mat以mat文件格式存储数据(默认)ascii用ascii格式保存数据append给已存在matf文件增加变量v4也存储为mat文件格式,但能被MATLAB4.0读取load命令可以加载mat文件或普通的ascii文件中的数据。load命令的形式如下load filename option如果只有load命令,MATLAB将加载matlab.mat文件中的所有数据。如果还跟着一个文件名,它load命令将
9、会加载这个文件中的数据。支持load命令的参数被列于表8.1中。尽管它们的优点不是十分的明显,但是save和load命令是MATLAB中功能最强大,最有用的I/O命令。它的优点是1.这些命令易于使用2.mat文件的平台独立。在一个支持MATLAB的计算机上编写的文件,在另一种支持MATLAB的计算机上,可以被读取。这种格式可以在PC,Mac,许多不同版本的Unix上互相转换。3.mat文件高效的硬盘空间使用者,它存储数据是高精度的,在mat文件和ascii文件转化过程中会出现精度下降的情况。4.mat文件存储了工作区内的每一个变量的所有信息,包括它的类属,名字和它是不是全局变量。在I/O其他类
10、型数据存储格式中所有的这些信息都会丢失。例如,假设工作区包含下面信息。 whosNameSizeBytesClassa 10x10 800double array (global)ans1x18double arrayb 10x10 800double arrayc2x2 332cell arraystring1x16 32char arraystudent1x3 2152struct arrayGrand total is 372 elements using 4124 bytes如果工作区用save workspace.mat命令存储,那么文件workspace.mat就会被自动创建。当这
11、个文件被加载时,工作区中的所有信息都会被恢复,包括每一项的类型和一变量是否为全局变量。这个命令的缺点是生成的mat文件只能由MATLAB调用,其他的程序不可能利用他共享数据。如要你想要与其他程序共享数据,可以应用-ascii参数,但它有诸多的限制。表8.2 load命令参数参数描述-mat把文件当作mat文件看待(如果扩展名是mat,此为默认格式)-ascii把文件当作ascii格式文件来看待(如果扩展名不为mat,此为默认格式)好的编程习惯除非我们必须与非MATLAB程序进行数据交换,存储和加载文件时,都应用mat文件格式。这种格式是高效的且移植性强,它保存了所有MATLAB数据类型的细节。
12、save -ascii根本不能存储单元阵列和结构数据,在保存字符串之前,它要把字符串转化相应的数字形式。load -ascii命令只能加载空间独立的数据,这些数据每一行的元素个数都相等,MATLAB把所有的数据都存储于一个变量中,这个变量与输出文件同名。如果你要用更高的要求(例如,保存和加载字符串,单元阵列或结构数组并与其它程序进行交换),那么你需要本章后面介绍的I/O命令。如果我们要加载的文件名或变量名是字符串,那么我们要用这些命令的函数形式。例如,下面的代码段要求用户提供一个文件名,并把当前工作区保存在那个文件中。filename = input(Enter save file name:
13、 ,s);save(filename);8.3 MATLAB文件过程简介为了使用在MATLAB程序中的文件我们需要一些方法选出我们所要的文件,并从中读取或写入数据。在MATLAB中有一种非常灵活的读取/写入文件的方法,不管这个文件是在磁盘还是在磁带上或者是其他的存储介质。这种机制就叫做文件标识(file id)(有时可简写为fid),当文件被打开,读取,写入或操作时,文件标识是赋值于一个文件的数。文件标识是一个正整数。两种文件标识是公开的文件标识1是标准输出机制,文件标识2是标准错误机制(stderr)。其他的文件标识,在文件打开时创立,文件关闭时消逝。许多的MATLAB语句可以控制磁盘文件的
14、输入或输出。文件I/O函数被总结在表8.3中。表8.3 MATLAB输入/输出语句类别函数描述加载/保存工作区load加载工作区save保存工作区文件打开/关闭fopen打开文件fclose关闭文件二进制I/Ofread从文件中读取二进制数据fwrite把二进制数据写入文件格式化I/Ofscanf从文件中读取格式化数据fprintf把格式化数据写入文件fgetl读取文件的一行,忽略换行符fgets读取文件的一行,不忽略换行符文件位置、状态delete删除文件exist检查文件是否存在ferror所需文件的I/O错误情况feof检测文件的结尾fseek设置文件的位置ftell检查文件的位置fre
15、wind回溯文件临时情况tempdir得到临时目录名tempname得到临时文件名我们可以用fopen语句把文件标识传递给磁盘文件或设备,用fclose语句把他们从中分开。一旦一个文件用fopen语句得到一个文件标识,我们就可以利用MATLAB输入输出语句。当我们对这个文件操作完后,fclose语句关闭并使文件标识无效。当文件打开时,函数frewind和fseek常用于改变当前文件读取和写入的位置。在文件中读取或写入数据的方法有两种方法:像二进制数据或像格式化字符数据。由实际位样式组成的二进制数据常用于存储于计算机内存中。读取和编写二进制数据是非常高效的,但是用户不能读取存在于文件中的数据。在
16、格式化文件中的可以转化为符串的数据可以由用户直接读取。格式化I/O操作比二进制I/O操作要慢得多,效率要低得多。在本章中,我们将讨论两种类型的I/O的操作。8.4 文件的打开与关闭文件的打开与关闭函数,fopen和fclose将在本节描述。8.4.1 fopen函数fopen函数打开一个文件并对返回这个文件的文件标识数。它的基本形式如下:fid = fopen(filename, permission)fid, message = fopen(filename, permission)fid, message = fopen(filename,permission, format)其中file
17、name是要打开的文件的名字,premission用于指定打开文件的模式,format是一个参数字符串,用于指定文件中数据的数字格式。如果文件被成功打开,在这个语句执行之后,fid将为一个正整数,message将为一个空字符。如果文件打开失败,在这个语句执行之后,fid将为-1,message将为解释错误出现的字符串。如果MATLAB要打开一个不为当前目录的文件,那么MATLAB将按MATLAB搜索路径搜索。permisson的字符串被列在表8.4中。对于一些如PC一样的平台,它更重要的是区分文本文件和二进制文件。如果文件以文本格式打开,那么一个“t”就应加入到permission字符串中(例
18、如“rt”或“rt+”)。表8.4 fopen文件permissions文件permission意义r以只读格式读取文件r+可对文件进行读写w删除一个已存在文件的内容(或创建一个新文件),并以只写格式打开w+删除一个已存在文件的内容(或创建一个新文件),并以读写格式打开a打开一个已存在的文件(或创建一个新文件),并以只写文件格式打开把写入的内容增加到文件的结尾a+打开一个已存在的文件(或创建一个新文件),并以只写文件格式打开把写入的内容增加到文件的结尾W不进行自动洗带的写入数据(针对于磁带机的特殊命令)A不进行自动洗带的添加数据(针对于磁带机的特殊命令)如果是以二进制模式找开,那么“b”应加到
19、permission字符串中(例如“rb”)。这实际上是不需要的,因为文件默认打开的方式是二进制模式。文本文件和二进制文件在Unix系统上是没有区别的,所以在这系统上,r和b都不需要。在fopen函数中的format字符串数据存储在文件中的格式。当在两计算机中传递互相矛盾的数据格式时,这个字符串才是必须的。一些可能的数字格式被总结在表8.5中。你可以从MATLAB reference manual(参考手册)中得到所有可能的数字格式。这个函数有两种提供信息的格式。函数fids = fopen(all)返回一个行向量,这个行向量由当打开的所有文件的文件标识组成(除了stdcut和stderr)。
20、在这个向量中的元素的个数与所要打开的文件的个数相等。函数filename, permission, format = fopen(fid)对于一指定文件标识的打开文件,返回它的名字,权限(permission)字符串和数字格式。下面是一些正确应用fopen函数的例子。8.4.1.1 情况1:为输入而打开一二进制文件下面的函数只为输入二进制数据而打开文件example.dat。fid = fopen(example.dat,r)权限(permission)字符串是“r”,它指出这个文件的打开方式为只读。这个字符串也可以是“rb”,但这是没有必要的,因为MATLAB默认打开的是二进制文件。8.4.
21、1.2 情况2:为文本输出打开一文件下面的函数以文本输出打开文件outdat。fid = fopen(outdat,wr)或fid = fopen(outdat,at)权限字符串“wt”指定这个文件为新建文本文件。如果这个文件已存在,那旧文件就会被删除,打开新建的文件等待写入数据。如果我们要替换先前已存在的数据,那么就可以采用这个形式。权限运算符“at”指定一个我们想要增加数据的文本文件。如果这个文件已经存在了,那么它将会被打开,新的数据将会添加到已存在的数据中。如果我们不想替换已存在的数据,那么就可以采用这个方式。8.4.1.3 以读写模式打开文件下面的函数打开文件junk,可以对它进行二进
22、制输入和输出。fid = fopen(junk, r+)或fid = fopen(junk,w+)每一个语句与第二个语句的不同为第一句打开已存在文件,而第二个语句则会删除已存在的文件。好的编程习惯在使用fopen语句时,一定要注意指定合适的权限,这取决于你是要读取数据,还是要写入数据。好的编程习惯可以帮助你避免(类似于覆盖的)错误。在试图打开一个文件之后,检查错误是非常重要的。如果fid的值为-1,那么说明文件打开失败。你将把这个问题报告给用户,允许他们选择其他的文件或跳出程序。好的编程习惯在文件打开操作后检查它的状态以确保它被成功打开。如果文件打开失败,提示用户解决方法。8.4.2 fclo
23、se函数fclose函数用于关闭一文件。它的形式为status = fclose(fid)status = fclose(all)其中fid为文件标识,status是操作结果,如果操作成功,status为0,如果操作失败,status为-1。函数status = fclose(all)关闭了所有的文件,除了stdout(fid = 1)和stderr(fid = 0)。如果所有的文件关闭成功,status将为0,否则为-1。8.5 二进制I/O函数二进制I/O函数,fwrite和fread,将在本节讨论。8.5.1 fwrite函数函数fwrite以自定义格式把二进制数据写入一文件。它的形式为
24、count = fwrite(fid, array, precision)count = fwrite(fid, array, precision skip)其中fid是用于fopen打开的一个文件的文件标识,array是写出变量的数组,count是写入文件变量的数目。MATLAB以列顺序输出数据,它的含义为第一列全部输出后,再输出第二列等等。例如,如果array = 那么数据输出的顺序为1,3,5,2,4,6。参数precision字符串用于指定输出数据的格式。MATLAB既支持平台独立的精度字符串,在所有的有MATLAB运行的电脑,它是相同的,也支持平台不独立的精度字符串,它们在不同类型的
25、电脑上精度也不同。你应当只用平台独立的字符串,在本书中出现的字符串均为这种形式。表8.6 MATLAB精度字符串精度字符串C/Fortan形式意义charchar*16位字符scharsigned char8位有符号字符ucharunsigned char8位无符号字符int8integer*18位整数int16integer*216位整数int32integer*432位整数int64integer*864位整数uint8integer*18位无符号整数uint16integer*216位无符号整数uint32integer*432位无符号整数uint64integer*864位无符号整数f
26、loat32real*432位浮点数float64real*864位浮点数bitNN位带符号整数(1N64)ubitNN位无符号整数(1N64)平台独立的精度显示在表8.6中。所有的这些精度都以字节为单位,除了“bitN”和“ubitN”,它以位为单位。选择性参数skip指定在每一次写入输出文件之前要跳过的字节数。在替换有固定长度的值的时侯,这个参数将非常的有用。注意如果precision是一个像“bitN”或“ubitN”的一位格式,skip则用位当作单位。8.5.2 fread函数函数fread读取用用户自定义格式从一文件中读取二进制数据。它的格式如下array, count = frea
27、d(fid, size, precision)array, count = fread(fid, size, precision, skip)其中fid是用于fopen打开的一个文件的文件标识,array是包含有数据的数组,count是读取文件中变量的数目,size是要读取文件中变量的数目。参数size用于指定读取文件中变量的数目。这个参数有三种形式。l n准确地读取n个值。执行完相应的语句后,array将是一个包含有n个值的列向量l Inf读取文件中所有值。执行完相应的语句后,array将是一个列向量,包含有从文件所有值。l n,m从文件中精确定地读取nm个值。array是一个nm的数组。如
28、果fread到达文件的结尾,而输入流没有足够的位数写满指定精度的数组元素,fread就会用最后一位的数填充,或用0填充,直到得到全部的值。如果发生了错误,读取将直接到达最后一位。参数precision和size在函数fread和函数fwrite中有相同的意义。例8.1 读写二进制数据在本例中显示的脚本文件创建了一个含有10000个随机数的数组,以只写方式打开一个自定义文件,用64位浮点数格式把这个数据写入磁盘,并关闭文件。程序打开所要读取的文件,并读取数组,得到一个100100的数组。它用来说明二进制I/O操作。% Script file: binary_io.m% Purpose:% To
29、illustrate the use of binary i/o functions.% Record of revisions:% Date Programmer Description of change% = = =% 12/19/98 S. J. Chapman Original code% Define variables:% count - Number of values read / written% fid - File id% filename - File name% in_array - Input array% msg - Open error message% ou
30、t_array - Output array% status - Operation status% Prompt for file namefilename = input(Enter file name: ,s);% Generate the data arrayout_array = randn(1,10000);% Open the output file for writing.fid,msg = fopen(filename,w);% Was the open successful?if fid 0 % Write the output data. count = fwrite(f
31、id,out_array,float64); % Tell user disp(int2str(count) values written.); % Close the file status = fclose(fid);else % Output file open failed. Display message. disp(msg);end% Now try to recover the data. Open the% file for reading.fid,msg = fopen(filename,r);% Was the open successful?if fid 0 % Read
32、 the input data. in_array, count = fread(fid,100 100,float64); % Tell user disp(int2str(count) values read.); % Close the file status = fclose(fid);else % Input file open failed. Display message. disp(msg);end当这个程序运行时,结果如下 binary_ioEnter file name: testfile10000 values written.10000 values read.在当前目
33、录下,有一个80000字节的文件testfile被创建,这个文件之所以占80000个字节,是因为它含有10000个64位的值,每一个值占8个字节。测试8.1本测试提供了一个快速的检查方式,看你是否掌握了8.1到8.5的基本内容。如果你对本测试有疑问,你可以重读8.1到8.5,问你的老师,或和同学们一起讨论。在附录B中可以找到本测试的答案。1.为什么函数textread尤其用于读取由其他的语言编写的数据。2.用mat存储数据的优缺点?3.哪些MATLAB函数用于找开和关闭文件?打开一个二进制文件和打开一个文本文件有什么不同?4.编写MATLAB语言找开一个已存在的文件myinput.dat,把新
34、增加的内容添加到最后一行。5.编写MATLAB语句,需要以只读模式打开一个无格式的二进制输入文件input.dat。检测文件是否存在,如果不存在,它就产生一个合适的错误信息。看第6题和第7题,判断MATLAB语句是否正确。如果有错误,指出错在那里。6.fid = fopen(file1, rt);array = fread(fid, Inf)fclose(fid);7.fid = fopen(file1, w);x = 1:10;count = fwrite(fid, x);fclose(fid);fid = fopen(file1,r);array = fread(fid, 2 Inf)fc
35、lose(fid);8.6 格式化I/O函数在本节中,我们向大家介绍格式化I/O函数。8.6.1 fprint函数函数fprint把以户自定义格式编写的格式化数据写入一个文件。它的形式为count = fprintf(fid, format, val1, val2, .)fprintf(format, val1, val2, .)其中fid是我们要写入数据那个文件的文件标识,format是控制数据显示的字符串。如果fid丢失,数据将写入到标准输出设备(命令窗口)。这些格式已经在第二章介绍过。格式(format)字符串指定队列长度,小数精度,域宽和输出格式的其他方面。它包括文字数字字符(%)和字
36、符序列(用于指定输出数据显示的精确格式)。一个典型的数据输出格式字符串图8.1所示。字符%总是标志着格式化字符串的开始,在字符%之后,这字符串应包括一个标识(flag),一个域宽,一个精度指定符和一个转换指定符。字符%,转换指定符一般会要求出在任何格式中,而标识,域宽,精度指定符是可选的。%-12.5e开始的标志(必需)修饰符(可选)域宽(可选)精度(可选)格式描述(必需)图8.1 数据输出格式字符串可能的转换指定符被列在表8.7中,可能的修改符(标识)被列在了表8.8中。如果我们用格式化字符串指定域宽和精度,那么小数点前的数就是域宽,域宽是所要显示的数所占的字符数。小数点后的数是精度,是指小
37、数点后应保留的位数。除了普通的字符和格式字符,还有转义字符常用在格式化字符串。这些特殊的字符被列在了表8.9中。表8.7函数fprintf的格式转换指定符指定符描述%c单个字符%d十进制表示(有符号的)%e科学记数法(用到小写的e,例3.1416e+00)%E科学记数法(用到大写的e,例3.1416E+00)%f固定点显示%g%e和%f中的复杂形式,多余的零将会被舍去%G与%g类似,只不过要用到大写的E%o八进制表示(无符号的)%s字符串%u十进制(无符号的)%h用十六进制表示(用小写字母af表示)%H用十六进制表示(用大写字母AF表示)表8.8格式标识(修改符)标识(修改符)描述负号(-)数
38、据在域中左对齐,如果没有这个符号默认为右对齐+输出时数据带有正负号0如果数据的位数不够,用零填充前面的数表8.9 格式字符串的转义字符转义序列描述n换行t水平制表b退后一格r回车符,使屏幕光标移到当前行开关,下移到下一行f跳页符号打印一个普通反斜杠or打印一个省略号或单一引证%打印一个百分号(%)8.6.2 格式转换指定符的理解理解大量的格式指定符最好的方法是用例子,现在我们看一些例子以及它们的结果。8.6.2.1 情况1:显示十进制整数数据显示十进制整数数据要用到%d格式转换指定符。如果需要的话,d可能出现在标识(flag),域宽和精度指定符之前。如果有用的话,精度指定符可以指定要显示的数据
39、的最小数字个数,如果没有足够多的数字,那么MATLAB将在这个数之前添加0。函数结果评论fprintf(%dn,123)-|-|123按需要字符的个数,显示这个数据。例如数123,需要三个字符fprintf(%6dn,123)-|-| 123用6字符域宽显示数字。在这个域中的数是右对齐的。fprintf(%6.4dn,123)-|-| 0123用6字符域宽显示数字,最少也要用4字符域宽。在这个域中的数是右对齐的。fprintf(%-6.4dn,123)-|-|0123 用6字符域宽显示数字。最小也要用到4字符域宽,在这个域中的数是左对齐的。fprintf(%+6.4dn,123)-|-| +0
40、123用6字符域宽显示数字,最少也要用到4字符域宽,加上一个正/负号。在这个域中的数是右对齐的。如果用格式指定符%d显示一个非十进制数,这个指定符将会被忽略,这个数将会以科学计算法格式显示。例如fprintf(%6dn,123.4)将产生结果1.234000e+002。8.6.2.2 情况2:显示浮点数数据浮点数数据的显示要用到%e,%f。,%g格式转换指符。如果需要的话,这些格式转换指符可能出现在标识(flag),域宽和精度指定符之前。如果指定的域宽太小了,不能显示这个数,则这个域宽是无效的。否则,则应用指定的域宽。函数结果评论fprintf(%fn,123.4)-|-|123.400000
41、按需要字符的个数显示这个数据。%f默认的格式是精确到小数点后6位fprintf(%8.2fn,123.4)-|-| 123.40用8字符域宽显示这个数,其中两域宽用于显示小数。fprintf(%4.2fn,123.4)-|-|123.40用6字符域宽来显示这个数,指定的域宽因太小而被忽略。fprintf(%10.2en,123.4)-|-|1. 23e+002以科学记数法显示数据,域宽为10,小数点占2位。默认这个数是右对齐的。fprintf(%10.2en,123.4)-|-|1 .23E+002与上面相同,只不过E为大写8.6.2.3 情况3:显示字符数据字符数据的显示要用到%e,%c格式
42、转换指符。如果需要的话,这些格式转换指符可能出现在标识(flag),域宽和精度指定符之前。如果指定的域宽太小了,不能显示这个数,则这个域宽是无效的。否则,则应用指定的域宽。函数结果评论fprintf(%cn,s)-|-|s显示单个字符fprintf(%sn,string)-|-|string显示一个字符串fprintf(%8sn,string)-|-| string用8字符串域宽显示字符串,默认是右对齐格式fprintf(%-8sn,string)-|-|string 用8字符串域宽显示字符串,这个字符串是左对齐的8.6.3 如何使用格式字符串函数fprintf包括一个格式字符串(在要打印出的
43、0或更多的值之后)。当函数fprintf执行时,函数fprintf的输出参数列表将会按格式字符串的指示输出。这个函数从从变量的左端和格式字符的左端开始执行,并从左向右扫描,输出列表的第一个值与格式字符串中第一个格式输出符联合,等等。在输出参数列表中的值必须是相同的类型,格式必须与对应的格式描述符相对应,否则的话,意外的结果将会产生。例如,假设我们要用%c或%d描述符显示浮点数123。4,这个描述符将会全部被忽略,这个数将会以科学记数的方式打印出来。常见编程错误保证fprintf函数中的数据类型与格式字符串中的格式转换指定符的类型要一一对应,否则将会产生意料之外的结果。程序从左向右读取函数fprint中的变量列表,它也从左向右读取相应的格式字符串。按照下面的规则,程序扫描格式字符串1.按从左向右的顺序扫描格式字符串。格式字符串中的第一个转换指定符与fprint函数输出参数列表中的第一个值相结合,依此类推。每一个格式转换指定符的类型与输出数据类型必须相同。在下面的例子
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100