DoeHoon Lee, Ph.D dohoon@pnu.edu Visual Computing & Biomedical Computing Lab(VisBiC) School of Computer Science & Engineering Pusan National University http://visbic.cse.pnu.edu/ cse pnu edu/ 파일열기와닫기 fopen fclose 파일읽기 textread load fread fgetl, fgets textscan 파일쓰기 save fprintf sprintf fwrite 파일관련함수들 exist, fseek, ferror, frewind 등 2 파일읽기 textread : 텍스트, textscan이 flexible 선호함. [a, b, c, ] = textread(filename, format, n) load : MAT 파일, ascii 파일 workspace로읽음. fread : 이진데이터를지정한서식으로읽음. [array,count]=fread(fid,size,precision) fscanf : 파일로부터서식화된데이터, 지정한방식으로읽음. array=fscanf(fid,format)/[array,count]=fscanf(fid,format,size) fgetl : 줄바꿈제외한줄읽음. line=fgetl(fid) fgets : 줄바꿈포함한줄읽음. line=fgets(fid) textscan : 서식화된아스키파일읽어서셀배열에저장. a=textscan(fid,'format',n,param,value...) 파일쓰기 save:matlab 자료 HDD에저장. m-file 저장. ascii도가능 fprintf : count=fprintf(fid,format,val1,...) sprintf : string=sprintf(format,val1,vl2...) fwrite : 이진데이터사용자가지정한서식으로파일에씀. c=fwrite(fid,array, precision) textread ASCII 데이터를읽을때사용 textread 보다 textscan 이빠르고 flexible 하기때문에선호함 [a, b, c, ] = textread(filename, format, n) format : 각줄의자료타입. 양식은 fprintf과같다. n : 읽어야할줄수. 언급이없으면 EOF 까지 [first, last, blood, gpa, age, answer]= textread('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') %test_input.dat James Jones O+ 3.0 22 Yes Sally Simth A+ 3.28 23 No first = 'James' 'Sally last = 'Jones' 'Simth blood = 'O+' 'A+ gpa = 3.000 3.2800 age = 22 23 answer = 'Yes' 'No 3
save MATLAB 의자료를하드디스크에저장. Binary 타입의 MAT 파일 (M file) ASCII 로저장할때는명시 save filename [list of variables] [options] filename.m 로저장 큰용량의자료를저장할때는 compresss 사용 1000개의 double array x와문자열변수 str을다음과같이저장 >> save test_matfile >>whos file test_matfile.mat save 옵션 옵션 설명 -mat MAT 파일서식으로데이터를저장 ( 기본값 ) -compress 디스크공간을절약하기위해데이터압축 -nocompress 데이터를압축하지않는다 ( 기본값 ) -ascii 공백으로분리된 ascii 서식으로데이터저장 -append 지정한변수를기존의 MAT 파일에추가 -unicode 유니코드부호화규칙에따라문자데이터저장 ( 기본값 ) -nounicode 현재시스템의부호화규칙에따라문자데이터저장 -v MATLAB 버전에서읽을수있는서식으로 MAT 파일저장 5 load MAT 파일이나보통의 ascii 파일로부터 data 를 workspace 로불러옴 load filename [option] 옵션 옵션 설명 -mat 파일을 MAT 파일로간주 ( 파일확장자가 mat 면기본값 ) -ascii 단점 파일공백으로분리한 ASCII 파일로간주 ( 파일확장자가 mat 가아니면기본값 ) 파일서식이독특하여다른프로그램과공유안됨 save ascii 로는셀또는구조체배열데이터저장할수없다. 문자열데이터는수치로변환후저장 6 fopen 함수 파일을연후이파일에사용할파일식별자를반환 fid = fopen(filename, permission) [fid, message]=fopen(filename, permission) [fid, message]=fopen(filename, permission, i format) permission : 파일을여는방식지정하는문자열 format : 파일내데이터의수치서식을지정하는선택적문자열 파일열기에성공하면 fid 는양의정수, message 는빈문자열. 파일열기에실패하면 -1, message 는오류를나타내는문자열 허용문자열 (permission) 현재열려있는모든파일 fid( 파일식별자 ) 를담은행벡터를구하기위한명령어 fids = fopen( all ) 열려있는파일식별자의파일이름, 허용문자열과수칙서식을얻기위해서는 [filename, permission, format] = fopen(fid) 파일허용문자열 설명 r 읽기전용으로연다 ( 기본값 ) r+ 읽기 / 쓰기용으로연다 w 기존내용삭제하거나새로운파일을만들어쓰기전용으로연다 ( 기본값 ) w+ 기존내용삭제하거나새로운파일을만들어읽기 / 쓰기용으로연다 a 기존파일이나새로운파일을쓰기전용으로연후파일끝에자료추가 a+ 기존파일이나새로운파일을읽기 / 쓰기용으로연후파일끝에자료추가 W A 자동플러싱 ( 자기테이프용특수명령어 ) 없이쓰기 자동플러싱없이추가하기 7 8
입력을위한이진파일열기 File close fid = fopen('ex.dat', 'r') status = fclose(fid) 텍스트출력을위한파일열기 fid = fopen('out','wt') fid = fopen('out','at') 'at') % 기존파일에추가 읽기 / 쓰기를위한이진파일열기 닫기성공 : 0, 실패 : -1 status = fclose( all ) stdout(fid=1) 과 stderr(fid=2) 을제외한모든열린파일닫음. 성공 : 0, 실패 : -1 fid = fopen('junk','r+') % 파일이존재해야 fid = fopen('junk','w+') % 기존파일삭제또는새로만듬 9 10 fwrite 함수 fread 함수 이진데이터를사용자가지정한서식으로파일에씀 count=fwrite(fid, array, precision) count=fwrite(fid, array, precision, skip) array : 쓸값을담을배열 (column major) count : 파일에쓴값의개수 precision : 데이터의출력서식지정 (Table 8.6) skip : 쓰기전에건너뛸수있는수. 단위는앞에지정한 precision 에따른다. 파일로부터이진데이터를사용자가지정한서식으로읽은후, 이와는다를수있는사용자서식으로데이터를반환 [array, count] = fread(fid, size, precision) [array, count] = fread(fid, size, precision, skip) size : 읽을자료의양지정 n : 정확하게 n 개의값을읽음. array 는파일로부터읽어들인 n 개의값을담을열벡터 Inf : 파일끝까지, [n m] : n x m 개 11 12
fprintf 함수 fprintf(fid, format, val1, val2, ) fprintf(fid, val1, val2, ) 지정자 설명 %c 단일문자 %d 10 진정수 %e e를사용하는지수표기법 %E E를사용하는지수표기법 %f 부동소수점표기 %g %e와 %f 중에길이가작은것. 유효숫자가아닌 0은나타나지않음 %G %g와같으나지수표기법에서 E를사용 %o 부호없는 8진수표기법 %s 문자열 %u 부호없는 10진정수 %x 16진수표기법 ( 소문자 a-f 사용 ) %X 16 진수표기법 ( 대문자 A-F 사용 ) 예 함수결과설명 fprintf( %d\n, 123) ---- ---- 필요한만큼 123 fprintf( %6d\n, 123) ---- ---- 123 6자리폭에 필드내에서숫자는오른쪽정렬 fprintf( %6 %6.d\n d\n, 123) ---- ---- 6 문자폭에서최소한네숫자를사용하여수를표시. 기 0123 본적으로필드에서숫자는오른정렬 fprintf( %-6.d\n, 123) ---- ---- 0123 6문자폭에네숫자사용하여숫자표시. 필드내에서숫자는왼쪽정렬 (-) 부호를사용. 6자리폭사용. 숫자는오른정렬 fprintf( %+6.d\n, 123) ---- ---- 부호를사용 자리폭사용 숫자는오른정렬 +0123 13 1 예 - 문자열 함수결과설명 fprintf( %c\n, s ) ---- ---- 단일문자표현 s fprintf( %s\n, string ) ---- ---- string 문자열표시 a = [10 20 30 0] fprintf( Output = %d %d\n, a) a=10; b=15; c=20; fprintf( Output=%d\nOutput=%.1f\n, a, b, c) Output t = 10 20 Output = 30 0 fprintf( %8s\n, string ) ---- ---- 8 문자폭에문자열표현 string fprintf( %-8s\n, string ) ---- ---- string 8 문자폭에문자열. 왼쪽정렬 (-) Output= 10 Output=15.0 Output= 20 Output=>> 15 16
sprintf 함수 string = sprintf(format, val1, val2, ) fscanf 함수 파일로부터서식화된데이터를사용자가지정한방식으로읽음 array=fscanf(fid, format) [array, count] = fscanf(fid, format, size) 17 18 예 fid = fopen('x.dat','r') 'r') [z,count]=fscanf(fid,'%f'); frewind(fid) [zz, count]=fscanf(fid,'%f',[2 f(fid 2]) frewind(fid) [zz2,count]=fscanf(fid,'%d',inf) frewind(fid) [zz3,count]=fscanf(fid,'%d.%d', [1 Inf]) frewind(fid) [zz,count]=fscanf(fid,'%c') frewind(fid) [zz5,count]=fscanf(fid,'%s') fclose(fid) fid = 3 z = 10 20 30 0 zz = 10 30 20 0 zz2 = 10 1 zz3 = 10 0 20 0 30 0 0 0 8 zz = 10.00 20.00 30.00 0.00 26 zz5 = 10.0020.0030.000.00 0 fgetl 파일로부터줄바꿈문자를제외하고다음한줄을문자열로읽음 line = fgetl( fid ) 19 20
fgets 파일로부터줄바꿈문자를포함하여다음줄을문자열로읽음 line = fgets(fid) exist : 작업공간내의변수, 내장함수, 파일존재여부확인 ident = exist( item ) ident = exist( item, kind ) kind : 유형 var, file, builtin, dir 반환값종류 0 : 대상이존재하지않음 1 : 현재작업공간내의변수 2 : M 파일또는알려지지않은유형의파일 3 : MEX 파일 : MDL 파일 5 : 내장함수 6 : P 파일 7 : 디렉토리 8 : Java class 21 22 ferror 오류지시자를가져와이해하기쉬운문자메시지로번역 message = ferror(fid) message = ferror(fid, clear ) [ message, errnum] = ferror(fid) feof 파일의끝인지검사 eofstat = feof(fid) 파일끝 : 논리참값 (1), 아니면 : 0 ftell fid로지정한파일의파일위치지시자의현재값반환. 위치는파일의첫머리로부터거리를바이트단위로재어 0이아닌정수로표현. -1 : 실패 : position = ftell(fid) frewind 파일의지시자를파일처음으로. : frewind(fid) fseek 파일의위치지시자를파일내의임의의위치로보냄 : status = fseek(fid, offset, origin) origin - bof : 파일첫머리, cof : 현위치, eof : 파일끝 textscan 유형이서로다를수도있는데이터의열을서식화된아스키파일을읽어서셀배열에저장 a = textscan(fid, format ) a = textscan(fid, format, N) a = textscan(fid, format, param, value, ) a = textscan(fid, format, N, param, value, ) 23 2
fid = fopen( test_input1.dat, rt ) a = textscan(fid, %s %s %s %f %d %s, -1) a = Columns 1 through %test_input1.dat James Jones O+ 3.0 22 Yes Sally Simth A+ 3.28 23 No Hans Carter B- 2.8 19 Ye Sam Spade A+ 3.12 21 Yes {x1 cell} {x1 cell} {x1 cell} [x1 double] Columns 5 through 6 [x1 int32] {x1 cell} uiimport structure = uiimport >> a{1} 'James' 'Sally' 'Hans' 'Sam' 25 26 열 \ 행 B C D E F G 1 2 xlsread 명령 var = xlsread( filename ) filename : 엑셀파일이름 엑셀파일에여러 sheet 가있으며첫번째 sheet 읽음 3 5 6 7 xlswrite을사용한다 xlswrite( filename, variablename) sheetname과 range 를사용할수있음 varablename : array or cell array 특정 sheet 에서읽을때 var = xlsread( filename, sheetname ) sheet 의이름 (sheetname) 은문자열형태로입력 특정위치의일부분 var = xlsread( filename, sheetname, range ) range 는문자열형태로입력. 사각형영역을의미한다 예. C2:E5 는열 2,3,,5 행 C, D, E 을의미하는 x 3 영역을의미 Ex SUCCESS = XLSWRITE('c:\matlab\work\myworkbook.xls',A,'A2:C') Write A to the workbook file, myworkbook.xls, and attempt to fit the elements of A into the rectangular worksheet region, A2:C. On success, SUCCESS will contain true, while on failure, SUCCESS will contain false. 27 28
csvread 이용 Given the file csvlist.dat that contains the comma-separated values M = csvread(filename) M = csvread(filename, row, col) M = csvread(filename, row, col, range) 02, 0, 06, 08, 10, 12 03, 06, 09, 12, 15, 18 05, 10, 15, 20, 25, 30 07, 1, 21, 28, 35, 2 11, 22, 33,, 55, 66 To read the entire file, use >>csvread('csvlist.dat') 2 6 8 10 12 M= csvread(filename, row, col, range) reads only the range specified. Specify range using the notation [R1 C1 R2 C2] where (R1,C1) is the upper left corner of the data to be read and (R2,C2) is the lower right corner. You can also specify the range using spreadsheet notation, as in range = 'A1..B7'. 3 6 9 12 15 18 5 10 15 20 25 30 7 1 21 28 35 2 11 22 33 55 66 To read the matrix starting with zero-based row 2, column 0, and assign it to the variable m, >>m = csvread('csvlist.dat', 2, 0) m = 5 10 15 20 25 30 7 1 21 28 35 2 11 22 33 55 66 To read the matrix bounded by zero-based (2,0) and (3,3) and assign it to m, >>m = csvread('csvlist.dat', 2, 0, [2,0,3,3]) m = 5 10 15 20 7 1 21 28 29 30 csvwrite 이용 dlmwrite Write matrix to ASCII-delimited file csvwrite(filename,m) csvwrite(filename,m,row,col) m = [3 6 9 12 15; 5 10 15 20 25;... 7 1 21 28 35; 11 22 33 55]; >>csvwrite('csvlist.dat',m) type csvlist.dat Syntax dlmwrite(filename, M) dlmwrite(filename, M, 'D') dlmwrite(filename, M, 'D', R, C) dlmwrite(filename, M, 'attrib1', value1, 'attrib2', value2,...) dlmwrite(filename, M, '-append') dlmwrite(filename, M, '-append', attribute-value list) 3, 6, 9,12,15, 5,10,15,20,25 7,1,21,28,35 11,22,33,,55 The next example writes the matrix to the file, starting at a column offset of 2. >>csvwrite('csvlist.dat',m,0,2) type csvlist.dat,,3,6,9,12,15,,5,10,15,20,25,,7,1,21,28,35 dlmread Read ASCII-delimited file of numeric data into matrix Graphical Interface As an alternative to dlmread, use the Import Wizard. To activate the Import Wizard, select Import data from the File menu. Syntax M = dlmread(filename) M = dlmread(filename, delimiter) M = dlmread(filename, delimiter, R, C) M = dlmread(filename, delimiter, range),,11,22,33,,55 31 32
Example 1 Export the 5-by-8 matrix M to a file, and read it with dlmread, first with no arguments other than the filename: >>rand('state', 0); M = rand(5,8); M = floor(m * 100); >>dlmwrite('myfile.txt', myfile.txt M, 'delimiter', '\t') >>dlmread('myfile.txt') 95 76 61 0 5 20 1 1 23 5 79 93 35 19 7 8 60 1 92 91 81 60 52 8 82 73 1 0 27 93 20 89 17 89 13 19 6 67 Now read a portion of the matrix by specifying the row and column of the upper left corner: >>dlmread('myfile.txt', '\t', 2, 3) 91 81 60 52 1 0 27 93 20 89 13 19 6 67 This time, read a different part of the matrix using a range specifier: >>dlmread('myfile.txt', '\t', 'C1..G') 61 0 5 20 1 79 93 35 19 7 92 91 81 60 73 1 0 27 93 Example 2 Export matrix M to a file, and then append an additional matrix to the file that is offset one row below the first: >>M = magic(3); >>dlmwrite('myfile.txt', t t' [M*5 M/5], ' ') >>dlmwrite('myfile.txt', rand(3), '-append',... 'roffset', 1, 'delimiter', ' ') type myfile.txt 80 10 15 65 3.2 0. 0.6 2.6 25 55 50 0 1 2.2 2 1.6 5 35 30 60 1.8 1. 1.2 2. 20 70 75 5 0.8 2.8 3 0.2 0.99008 0.9831 0.3200 0.78886 0.21396 0.9601 0.3866 0.639 0.72663 When dlmread imports these two matrices from the file, it pads the smaller matrix with zeros: >>dlmread('myfile.txt') 0.0000 5.0000 30.0000 1.6000 0.2000 1.2000 15.0000 25.0000 35.0000 0.6000 1.0000 1.000 20.0000 5.0000 10.0000 0.8000 1.8000 0.000 0.6038 0.0153 0.9318 0 0 0 0.2722 0.768 0.660 0 0 0 0.1988 0.51 0.187 0 0 0 33 3 Example 1 Export matrix M to a file delimited by the tab character and using a precision of six significant digits: >>dlmwrite('myfile myfile.txt txt', M, 'delimiter', '\t',... 'precision', 6) >>type myfile.txt 0.893898 0.2809 0.582792 0.32907 0.199138 0.6922 0.2396 0.22595 0.298723 0.067811 0.515512 0.579807 0.6613 0.988335 0.333951 0.760365 Example 2 Export matrix M to a file using a precision of six decimal places and the conventional line terminator for the PC platform: >>dlmwrite('myfile myfile.txt txt', m, 'precision', '%.6f 6f',... 'newline', 'pc') type myfile.txt 16.000000,2.000000,3.000000,13.000000 5.000000,11.000000,10.000000,8.000000 9.000000,7.000000,6.000000,12.000000.000000,1.000000,15.000000,1.000000 Example 3 Export matrix M to a file, and then append an additional matrix to the file that is offset one row below the first: >>M = magic(3); dlmwrite('myfile.txt', txt' [M*5 M/5], ' ') >>dlmwrite('myfile.txt', rand(3), '-append',... 'roffset', 1, 'delimiter', ' ') >>type myfile.txt 0 5 30 1.6 0.2 1.2 15 25 35 0.6 1 1. 20 5 10 0.8 1.8 0. 0.8172 0.91338 0.2785 0.90579 0.63236 0.5688 0.12699 0.0975 0.95751 When dlmread imports these two matrices from the file, it pads the smaller matrix with zeros: >>dlmread('myfile.txt') 0.0000 5.0000 30.0000 1.6000 0.2000 1.2000 15.0000 25.0000 35.0000 0.6000 1.0000 1.000 20.0000 5.0000 10.0000 0.8000 1.8000 0.000 0.817 0.913 0.2785 0 0 0 0.9058 0.632 0.569 0 0 0 0.1270 0.0975 0.9575 0 0 0 35 36