一章文件輸入輸出知識(shí)分享_第1頁
一章文件輸入輸出知識(shí)分享_第2頁
一章文件輸入輸出知識(shí)分享_第3頁
一章文件輸入輸出知識(shí)分享_第4頁
一章文件輸入輸出知識(shí)分享_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第5章文件I/O高級(jí)文件的I/O操作讀寫MAT文件或者ASCII讀寫TXT文件讀寫EXCEL文件讀寫圖像文件低級(jí)文件的I/O操作打開和關(guān)閉文件讀寫二進(jìn)制文件讀寫格式化的文本文件控制文件指針位置幾點(diǎn)重要補(bǔ)充9/26/20241幾個(gè)概念數(shù)據(jù)輸入和輸出(I/O)輸入:從磁盤文件獲得數(shù)據(jù),加載到工作空間。輸出:從工作空間變量保存到文件中。高級(jí)文件和低級(jí)文件I/O操作高級(jí):針對(duì)不同的數(shù)據(jù)格式文件,提供不同的I/O函數(shù),有現(xiàn)成的函數(shù)供使用,僅需少量編程。低級(jí):使用文件標(biāo)識(shí)符可訪問任何類型的數(shù)據(jù)文件,更加靈活地完成相對(duì)特殊的任務(wù),需要復(fù)雜編程二進(jìn)制文件和文本文件(ASCII文件)9/26/20242二進(jìn)制文件和文本文件文本文件將文件看作是由字節(jié)(byte)組成的,每個(gè)字節(jié)(bit)的最高位都是0,文本文件使用了一個(gè)字節(jié)中的七位來表示所有的信息,而二進(jìn)制文件則是將字節(jié)中的所有位都用上了打開方式不同,對(duì)于這些0和1的處理也就不同。按照文本方式打開時(shí)會(huì)進(jìn)行轉(zhuǎn)換,將每個(gè)字節(jié)轉(zhuǎn)換成ASCII碼,以二進(jìn)制方式打開則不會(huì)進(jìn)行任何的轉(zhuǎn)換在記事本中進(jìn)行文本編輯的時(shí)進(jìn)行編輯的最小單位是字節(jié);而對(duì)二進(jìn)制文件編輯最小單位則是位(bit),不會(huì)直接通過手工的方式對(duì)二進(jìn)制文件進(jìn)行編輯9/26/202431、MAT文件的讀寫文件的存儲(chǔ)數(shù)據(jù)導(dǎo)入文件的打開9/26/20244save命令save命令的調(diào)用格式為:save,將工作區(qū)中的所有變量保存在當(dāng)前工作區(qū)中的文件中,文件名為matlab.mat,MAT文件可以通過load函數(shù)再次導(dǎo)入工作區(qū),MAT函數(shù)可以被不同的機(jī)器導(dǎo)入,甚至可以通過其他的程序調(diào)用;save('filename'),將工作區(qū)中的所有變量保存為文件,文件名由filename指定。如果filename中包含路徑,則將文件保存在相應(yīng)目錄下,否則默認(rèn)路徑為當(dāng)前路徑;save('filename','var1','var2',...),保存指定的變量在filename指定的文件中;save('filename','-struct','s'),保存結(jié)構(gòu)體s中全部域作為單獨(dú)的變量;save('filename','-struct','s','f1','f2',...),保存結(jié)構(gòu)體s中的指定變量;save('-regexp',expr1,expr2,...),通過正則表達(dá)式指定待保存的變量需滿足的條件;save('...,'format'),指定保存文件的格式,格式可以為MAT文件、ASCII文件等。9/26/20246函數(shù)調(diào)用格式函數(shù)格式說明save將工作空間所有變量保存在當(dāng)前目錄下文件matlab.mat內(nèi)savefn或save(‘fn’)將工作空間所有變量保存在當(dāng)前目錄下文件fn.mat內(nèi)savefnx1x2…xn將變量x1x2…xn保存到當(dāng)前目錄下文件fn.matsave(fn,’-struct’,’s’)保存結(jié)構(gòu)體s中全部域作為單獨(dú)的變量save('fn','v1','v2',...)保存指定的變量在fn指定的文件中save('fn','-struct','s','f1','f2',...)保存結(jié)構(gòu)體s中的指定變量save('-regexp',expr1,expr2,...),通過正則表達(dá)式指定待保存的變量需滿足的條件save('...,'format')指定保存文件的格式,格式可以為MAT文件、ASCII文件等。9/26/20247MAT數(shù)據(jù)導(dǎo)入 MATLAB中導(dǎo)入數(shù)據(jù)通常由函數(shù)load實(shí)現(xiàn),該函數(shù)的用法為:load,如果matlab.mat文件存在,導(dǎo)入matlab.mat中的所有變量,如果不存在,則返回error;loadfilename,將filename中的全部變量導(dǎo)入到工作區(qū)中;loadfilenameXYZ...,將filename中的變量X、Y、Z等導(dǎo)入到工作區(qū)中,如果文件為MAT文件,在指定變量時(shí)可以使用通配符“*”;loadfilename-regexpexpr1expr2...,通過正則表達(dá)式指定需要導(dǎo)入的變量;load-asciifilename,無論輸入文件名是否包含有擴(kuò)展名,將其以ascii格式導(dǎo)入,如果指定的文件不是數(shù)字文本,則返回error;load-matfilename,無論輸入文件名是否包含有擴(kuò)展名,將其以mat格式導(dǎo)入,如果指定的文件不是MAT文件,則返回error;9/26/20248Importdata函數(shù)MATLAB中,另一個(gè)導(dǎo)入數(shù)據(jù)的常用函數(shù)為importdata,該函數(shù)的用法為:importdata('filename'),將filename中的數(shù)據(jù)導(dǎo)入到工作區(qū)中;A=importdata('filename'),將filename中的數(shù)據(jù)導(dǎo)入到工作區(qū)中,并保存為變量A;importdata(‘filename’,‘delimiter’),將filename中的數(shù)據(jù)導(dǎo)入到工作區(qū)中,以delimiter指定的符號(hào)作為分隔符;與load函數(shù)不同,importdata將文件中的數(shù)據(jù)以結(jié)構(gòu)體的方式導(dǎo)入到工作區(qū)中。9/26/20249MAT文件的打開MATLAB中可以使用open命令打開各種格式的文件,MATLAB自動(dòng)根據(jù)文件的擴(kuò)展名選擇相應(yīng)的編輯器。讀者需要注意的是,open(‘filename.mat’)和load(‘filename.mat’)的不同,前者將filename.mat以結(jié)構(gòu)體的方式打開在工作區(qū)中,后者將文件中的變量導(dǎo)入到工作區(qū)中,如果需要訪問其中的內(nèi)容,需要以不同的格式進(jìn)行。9/26/2024102、文本文件的讀寫在上一節(jié)中介紹的函數(shù)和命令主要用于讀寫mat文件,在應(yīng)用中,需要讀寫更多格式的文件,如文本文件,word文件,xml文件,xls文件及圖像、音視頻文件等。本節(jié)介紹文本文件(txt)的讀寫。MATLAB中實(shí)現(xiàn)文本文件讀寫的函數(shù)如表所示。函數(shù)功能csvread讀入以逗號(hào)分隔的數(shù)據(jù)csvwrite將數(shù)據(jù)寫入文件,數(shù)據(jù)間以逗號(hào)分隔dlmread將以ASCII碼分隔的數(shù)值數(shù)據(jù)讀入到矩陣中dlmwrite將矩陣數(shù)據(jù)寫入到文件中,以ASCII分隔textread從文本文件中讀入數(shù)據(jù),將結(jié)果分別保存textscan從文本文件中讀入數(shù)據(jù),將結(jié)果保存為單元數(shù)組9/26/202411csvread函數(shù)M=csvread('filename'),將文件filename中的數(shù)據(jù)讀入,并且保存為M,filename中只能包含數(shù)字,并且數(shù)字之間以逗號(hào)分隔。M是一個(gè)數(shù)組,行數(shù)與filename的行數(shù)相同,列數(shù)為filename列的最大值,對(duì)于元素不足的行,以0補(bǔ)充。M=csvread('filename',row,col),讀取文件filename中的數(shù)據(jù),起始行為row,起始列為col,需要注意的是,此時(shí)的行列從0開始。M=csvread('filename',row,col,range),讀取文件filename中的數(shù)據(jù),起始行為row,起始列為col,讀取的數(shù)據(jù)由數(shù)組range指定,range的格式為:[R1C1R2C2],其中R1、C1為讀取區(qū)域左上角的行和列,R2、C2為讀取區(qū)域右下角的行和列。9/26/202412dlmread函數(shù)M=dlmread('filename')M=dlmread('filename',delimiter)M=dlmread('filename',delimiter,R,C)M=dlmread('filename',delimiter,range)其中參數(shù)delimiter用于指定文件中的分隔符,其他參數(shù)的意義與csvread函數(shù)中參數(shù)的意義相同,這里不再贅述。dlmread函數(shù)與csvread函數(shù)的差別在于,dlmread函數(shù)在讀入數(shù)據(jù)時(shí)可以指定分隔符,不指定時(shí)默認(rèn)分隔符為逗號(hào)。9/26/202413dlmwrite函數(shù)dlmwrite('filename',M),將矩陣M的數(shù)據(jù)寫入文件filename中,以逗號(hào)分隔;dlmwrite('filename',M,'D'),將矩陣M的數(shù)據(jù)寫入文件filename中,采用指定的分隔符分隔數(shù)據(jù),如果需要tab鍵,可以用“\t”指定;dlmwrite('filename',M,'D',R,C),指定寫入數(shù)據(jù)的起始位置;dlmwrite('filename',M,attribute1,value1,attribute2,value2,...),指定任意數(shù)目的參數(shù),可以指定的參數(shù)見下表;dlmwrite('filename',M,'-append'),如果filename指定的文件存在,在文件后面寫入數(shù)據(jù),不指定時(shí)則覆蓋原文件;dlmwrite('filename',M,'-append',attribute-valuelist),敘寫文件,并指定參數(shù)。dlmwrite函數(shù)的可用參數(shù)如表所示。參數(shù)名功能delimiter用于指定分隔符newline用于指定換行符,可以選擇“pc”或者“unix”roffset行偏差,指定文件第一行的位置,roffset的基數(shù)為0coffset列偏差,指定文件第一列的位置,coffset的基數(shù)為0precision指定精確度,可以指定精確維數(shù),或者采用c語言的格式,如“%10.5f”9/26/202414textread,textscan當(dāng)文件的格式已知時(shí),可以利用textread函數(shù)和textscan函數(shù)讀入。[a,b,c,...]=textread(filename,format,n)例如,假設(shè)文件test_input.dat包含下列數(shù)據(jù)JamesJonesO+3.5122YesSallySmithA+3.2823NO這些數(shù)據(jù)用下面的函數(shù)讀取一系列的數(shù)組。[first,last,blood,gpa,age,answer]=textread('test_input.dat','%s%s%s%f%d%s')9/26/202415低級(jí)文件I/O本節(jié)介紹一些基本的文件操作,這些操作如表所示:函數(shù)功能fclose關(guān)閉打開的文件feof判斷是否為文件結(jié)尾ferror文件輸入輸出中的錯(cuò)誤查找fgetl讀入一行,忽略換行符fgets讀入一行,直到換行符fopen打開文件,或者獲取打開文件的信息fprintf格式化輸入數(shù)據(jù)到文件fread從文件中讀取二進(jìn)制數(shù)據(jù)frewind將文件的位置指針移至文件開頭位置fscanf格式化讀入fseek設(shè)置文件位置指針ftell文件位置指針fwrite向文件中寫入數(shù)據(jù)9/26/202416fprintf函數(shù)count=fprintf(fid,format,A,...),該語句將矩陣A及后面其他參數(shù)中數(shù)字的實(shí)部以format指定的格式寫入到fid指定的文件中,返回寫入數(shù)據(jù)的字節(jié)數(shù)。上面語句中,參數(shù)format由%開頭,共可由四個(gè)部分組成,分別為:標(biāo)記(flag),為可選部分;寬度和精度指示,為可選部分;類型標(biāo)志符,為可選部分;轉(zhuǎn)換字符,為必需部分。9/26/202417標(biāo)記1.標(biāo)記標(biāo)記用于控制輸出的對(duì)齊方式,可以選擇的內(nèi)容如表所示。函數(shù)功能示例負(fù)號(hào)(-)在參數(shù)左側(cè)進(jìn)行判別%-5.2d加號(hào)(+)在數(shù)字前添加符號(hào)%+5.2d空格在數(shù)字前插入空格%5.2d0在數(shù)字前插入0%05.2d9/26/202418寬度和精度指示2.寬度和精度指示用戶可以通過數(shù)字指定輸出數(shù)字的寬度及精度,格式為:%6f,指定數(shù)字的寬度;%6.2f,指定數(shù)字的寬度及精度;%.2f,指定數(shù)字的精度。9/26/202419轉(zhuǎn)換字符3.轉(zhuǎn)換字符轉(zhuǎn)換字符用于指定輸出的符號(hào),可以選擇的內(nèi)容如表所示。標(biāo)志符意義%c輸出單個(gè)字符%d輸出有符號(hào)十進(jìn)制數(shù)%e采用指數(shù)格式輸出,采用小寫字母e,如:3.1415e+00%E采用指數(shù)格式輸出,采用大寫字母E,如:3.1415E+00%f以定點(diǎn)數(shù)的格式輸出%g%e及%f的更緊湊的格式,不顯示數(shù)字中無效的0%G與%g相同,但是使用大寫字母E%i有符號(hào)十進(jìn)制數(shù)%o無符號(hào)八進(jìn)制數(shù)%s輸出字符串%u無符號(hào)十進(jìn)制數(shù)%x十六進(jìn)制數(shù)(使用小寫字母a-f)%X十六進(jìn)制數(shù)(使用大寫字母A-F)9/26/202420例11-9利用fprintf函數(shù)在顯示器上輸出字符串>>fprintf(1,'It''sFriday.\n')It'sFriday.在該例中,利用1表示顯示器,并且用兩個(gè)單引號(hào)顯示單引號(hào),使用\n進(jìn)行換行。在格式化輸出中,這類符號(hào)稱為轉(zhuǎn)義符。MATLAB中的常用轉(zhuǎn)義符如表所示。轉(zhuǎn)義符功能\b退格\f表格填充\n換行符\r回車\ttab\\\,反斜線\''或''',單引號(hào)%%%,百分號(hào)9/26/2024219/26/202422fscanf函數(shù)array=fscanf(fid,format)[array,count]=fscanf(fid,format,size)其中fid是所要讀取的文件的文件標(biāo)識(shí)(fileid),format是控制如何讀取的格式字符串,array是接受數(shù)據(jù)的數(shù)組,輸出參數(shù)count返回從文件讀取的變量的個(gè)數(shù)。參數(shù)size指定從文件讀取數(shù)據(jù)的數(shù)目。這個(gè)函數(shù)有以下三個(gè)類型。n準(zhǔn)確地讀取n個(gè)值。執(zhí)行完相應(yīng)的語句后,array將是一個(gè)包含有n個(gè)值的列向量Inf讀取文件中所有值。執(zhí)行完相應(yīng)的語句后,array將是一個(gè)列向量,包含有從文件所有值。[n,m]從文件中精確定地讀取n×m個(gè)值。Array是一個(gè)n×m的數(shù)組。9/26/202423利用界面工具導(dǎo)入數(shù)據(jù)選擇工作區(qū)瀏覽器工具欄中的“ImportData”,選擇待導(dǎo)入的文件,這里我們選擇了一個(gè)文本文件,其內(nèi)容為逗號(hào)分隔的數(shù)字,打開窗口如圖所示。9/26/202424在該窗口中選擇分隔符號(hào),設(shè)置導(dǎo)入數(shù)據(jù)的起始行。在左側(cè)窗口中顯示的是文件中的內(nèi)容,右側(cè)窗口中是導(dǎo)入數(shù)據(jù)的預(yù)覽。設(shè)置完成后,點(diǎn)擊Next,進(jìn)入下一界面。在該界面中可以設(shè)置導(dǎo)入方式,預(yù)覽導(dǎo)入的變量,如圖所示。9/26/2024253、Excel文件的讀寫xlsfinfo:檢查文件是否包含Excel表格xlswrite:xlsread:9/26/2024264、圖像文件的讀寫函數(shù)調(diào)用格式函數(shù)說明imreadA=imread(fn,fmt)[X,map]=imread(fn,fmt)[…]=imread(fn)fn,圖像文件名,fmt圖像文件格式,如果缺省,會(huì)根據(jù)擴(kuò)展名識(shí)別圖像格式imwriteimwrite(A,fn,fmt)imwrite(X,map,fn,fmt)Imwrite(…,fn)以格式fmt寫圖像數(shù)據(jù)A到圖像文件fn。A可為m×n×3(彩色圖像)數(shù)組。如fmt缺省,根據(jù)fn擴(kuò)展名識(shí)別imfinfoInfo=imfinfo(fn,fmt)Info=imfinfo(fn)9/26/202427圖像格式其它情況saveasprint(h,’format’,fn)imshowimage9/26/202428低級(jí)文件I/O操作1、打開和關(guān)閉文件2、讀寫二進(jìn)制文件3、讀寫格式化的文本文件4、數(shù)據(jù)文件的定位9/26/2024291、文件的打開與關(guān)閉文件的打開

fopen函數(shù)的調(diào)用格式為:

fid=fopen(文件名,打開方式)

打開方式有:‘r’表示對(duì)打開的文件讀數(shù)據(jù),‘w’表示對(duì)打開的文件寫數(shù)據(jù),‘a(chǎn)’表示在打開的文件末尾添加數(shù)據(jù)。

fid用于存儲(chǔ)文件句柄值,句柄值用來標(biāo)識(shí)該數(shù)據(jù)文件,其他函數(shù)可以利用它對(duì)該數(shù)據(jù)文件進(jìn)行操作。9/26/202430文件數(shù)據(jù)格式有兩種形式,一是二進(jìn)制文件,二是文本文件。在打開文件時(shí)需要進(jìn)一步指定文件格式類型,即指定是二進(jìn)制文件還是文本文件。9/26/202431文件的關(guān)閉

文件在進(jìn)行完讀、寫等操作后,應(yīng)及時(shí)關(guān)閉。關(guān)閉文件用fclose函數(shù),調(diào)用格式為:

sta=fclose(fid)

該函數(shù)關(guān)閉fid所表示的文件。sta表示關(guān)閉文件操作的返回代碼,若關(guān)閉成功,返回0,否則返回–1。9/26/2024322、二進(jìn)制文件的讀寫操作讀二進(jìn)制文件

fread

函數(shù)可以讀取二進(jìn)制文件的數(shù)據(jù),并將數(shù)據(jù)存入矩陣。其調(diào)用格式為:

[A,COUNT]=fread(fid,size,precision)

其中A用于存放讀取的數(shù)據(jù),COUNT返回所讀取的數(shù)據(jù)元素個(gè)數(shù),fid為文件句柄,size為可選項(xiàng),若不選用則讀取整個(gè)文件內(nèi)容,若選用則它的值可以是下列值:9/26/202433

(1)N表示讀取N個(gè)元素到一個(gè)列向量。

(2)Inf表示讀取整個(gè)文件。

(3)[M,N]表示讀數(shù)據(jù)到M×N的矩陣中,數(shù)據(jù)按列存放。

precision代表讀寫數(shù)據(jù)的類型

9/26/202434寫二進(jìn)制文件fwrite函數(shù)按照指定的數(shù)據(jù)類型將矩陣中的元素寫入到文件中。其調(diào)用格式為:

COUNT=fwrite(fid,A,precision)

其中COUNT返回所寫的數(shù)據(jù)元素個(gè)數(shù),fid為文件句柄,A用來存放寫入文件的數(shù)據(jù),precision用于控制所寫數(shù)據(jù)的類型,其形式與fread函數(shù)相同。9/26/202435

例4-1建立一數(shù)據(jù)文件magic5.dat,用于存放5階魔方陣。

程序如下:

fid=fopen(‘magic5.dat’,‘w’);

cnt=fwrite(fid,magic(5),‘int32’);

fc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論