이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
로우 레벨 I/O를 사용하여 이진 데이터 가져오기
데이터를 가져오는 데 사용할 수 있는 로우 레벨 함수
로우 레벨 파일 I/O 함수를 사용하면 파일에서 데이터를 읽어오거나 파일에 데이터를 쓸 때 가장 직접적으로 제어할 수 있습니다. 그러나 이런 함수를 사용할 때는 사용이 쉬운 하이 레벨 함수에 비해 파일에 더 자세한 정보를 지정해야 합니다. 하이 레벨 함수와 이 하이 레벨 함수가 지원하는 파일 형식의 전체 목록을 보려면 가져오기 및 내보내기에 지원되는 파일 형식 항목을 참조하십시오.
하이 레벨 함수가 데이터를 가져올 수 없는 경우 다음 중 하나를 사용하십시오.
fscanf
- 텍스트 편집기에서 볼 수 있는 파일(텍스트 파일이나 ASCII 파일)에서 형식 지정된 데이터를 읽어옵니다. 자세한 내용은 형식 지정된 패턴의 데이터 읽어오기 항목을 참조하십시오.fgetl
과fgets
- 파일의 라인을 한 번에 하나씩 읽어옵니다. 여기서 각각의 라인은 새 줄(Newline) 문자로 구분됩니다. 자세한 내용은 라인 단위로 데이터 읽어오기 항목을 참조하십시오.fread
- 바이트 또는 비트 수준에서 데이터 스트림을 읽어옵니다. 자세한 내용은 파일에서 이진 데이터 읽어오기 항목을 참조하십시오.
참고
로우 레벨 파일 I/O 함수는 ANSI® 표준 C 라이브러리의 함수를 기반으로 합니다. 그러나 MATLAB®에서 사용하는 함수는 벡터화된 버전이며, 배열에서 데이터를 읽어오고 쓸 때 최소한의 제어 루프를 사용합니다.
파일에서 이진 데이터 읽어오기
어느 로우 레벨 I/O 함수에서든 파일을 가져오려면 먼저 fopen
을 사용하여 파일을 열고 파일 ID를 부여받아야 합니다. 파일에 대한 작업을 마치면 fclose
(
를 사용하여 파일을 닫습니다.fileID
)
기본적으로, fread
는 한 번에 1바이트씩 파일을 읽어 각 바이트를 8비트 부호 없는 정수(uint8
)로 해석합니다. fread
는 파일의 각 바이트가 하나의 요소로 표현되는 열 벡터를 생성합니다. 열 벡터의 값은 double
형 클래스입니다.
예를 들어, 다음과 같이 생성된 파일 nine.bin
을 살펴보겠습니다.
fid = fopen('nine.bin','w'); fwrite(fid, [1:9]); fclose(fid);
파일의 모든 데이터를 double
형 클래스의 9×1 열 벡터로 읽어 들이려면 다음을 수행하십시오.
fid = fopen('nine.bin'); col9 = fread(fid); fclose(fid);
배열의 차원 변경하기
기본적으로, fread
는 파일의 모든 값을 열 벡터로 읽어 들입니다. 그러나 사용자가 읽어 들일 값 개수를 지정하거나 2차원 출력 행렬으로 표현할 수도 있습니다.
예를 들어, 이전 예제에서 설명한 nine.bin
을 읽어 들이려면 다음을 수행하십시오.
fid = fopen('nine.bin'); % Read only the first six values col6 = fread(fid, 6); % Return to the beginning of the file frewind(fid); % Read first four values into a 2-by-2 matrix frewind(fid); two_dim4 = fread(fid, [2, 2]); % Read into a matrix with 3 rows and % unspecified number of columns frewind(fid); two_dim9 = fread(fid, [3, inf]); % Close the file fclose(fid);
입력값 표현하기
파일의 값이 8비트 부호 없는 정수가 아니라면 값 크기를 지정하십시오.
예를 들어, 다음과 같이 배정밀도 값으로 만든 파일 fpoint.bin
이 있다고 가정하겠습니다.
myvals = [pi, 42, 1/3]; fid = fopen('fpoint.bin','w'); fwrite(fid, myvals, 'double'); fclose(fid);
파일을 읽는 방법은 다음과 같습니다.
fid = fopen('fpoint.bin'); % read, and transpose so samevals = myvals samevals = fread(fid, 'double')'; fclose(fid);
정밀도 설명의 전체 목록을 보려면 fread
함수 도움말 페이지를 참조하십시오.
메모리 절약하기
기본적으로, fread
는 double
형 클래스로 구성된 배열을 생성합니다. 배열에 배정밀도 값을 저장하는 것은 문자나 정수, 단정밀도 값을 저장할 때보다 더 많은 메모리를 요합니다.
데이터 저장에 필요한 메모리 양을 줄이려면 다음 방법 중 하나를 사용하여 배열의 클래스를 지정하십시오.
별표(
'*'
)를 사용하여 입력값 클래스를 일치시킵니다. 예를 들어, 단정밀도 값을single
형 클래스의 배열로 읽어오려면 다음 명령을 사용하십시오.mydata = fread(fid,'*single')
'=>'
기호를 사용하여 입력값을 새 클래스에 매핑합니다. 예를 들어,uint8
값을uint16
배열로 읽어오려면 다음 명령을 사용하십시오.mydata = fread(fid,'uint8=>uint16')
정밀도 설명의 전체 목록을 보려면 fread
함수 도움말 페이지를 참조하십시오.
파일의 일부 읽어오기
MATLAB 로우 레벨 함수에는 파일의 이진 데이터의 일부를 읽을 수 있는 여러 가지 옵션이 있습니다.
배열의 차원 변경하기에 설명된 대로, 한 번에 지정된 개수의 값을 읽어옵니다. 이 방법을 파일의 끝 테스트하기에 함께 사용해 보십시오.
파일 내에서 읽기를 시작할 특정 위치로 이동합니다. 자세한 내용은 파일 내에서 이동하기 항목을 참조하십시오.
요소를 읽을 때마다 특정 바이트 수 또는 비트 수를 건너뜁니다. 예제는 Write and Read Complex Numbers 항목을 참조하십시오.
파일의 끝 테스트하기
파일을 열면 MATLAB에서 파일 내 현재 위치를 나타내는 포인터가 생성됩니다.
참고
빈 파일을 열면 파일 위치 표시자가 파일 끝으로 이동하지 않습니다. 읽기 작업을 하거나 fseek
및 frewind
함수를 사용하면 파일 위치 표시자의 위치가 바뀔 수 있습니다.
feof
함수를 사용하여 파일 끝에 도달했는지 확인할 수 있습니다. feof
는 파일 포인터가 파일 끝에 있으면 값 1
을 반환합니다. 그렇지 않으면, 0
을 반환합니다.
예를 들어, 다음과 같이 큰 파일을 분할하여 읽습니다.
filename = 'largedata.dat'; % hypothetical file segsize = 10000; fid = fopen(filename); while ~feof(fid) currData = fread(fid, segsize); if ~isempty(currData) disp('Current Data:'); disp(currData); end end fclose(fid);
파일 내에서 이동하기
데이터의 선택한 부분을 읽어오거나 쓰려면 파일 위치 표시자를 파일 내 임의 위치로 옮기십시오. 예를 들어, 다음 구문을 사용하여 fseek
를 호출합니다.
fseek(fid,offset,origin);
여기서
fid
는fopen
에서 가져온 파일 ID입니다.offset
은 바이트 단위로 지정된, 양의 오프셋 값이거나 음의 오프셋 값입니다.origin
은 계산을 시작할 위치를 지정합니다.'bof'
파일의 시작
'cof'
파일의 현재 위치
'eof'
파일의 끝
또는 파일 시작 부분으로 손쉽게 이동하려면 다음을 실행하십시오.
frewind(fid);
ftell
을 사용하여 지정된 파일 내에서의 현재 위치를 찾을 수 있습니다. ftell
은 파일의 시작 부분부터 떨어진 거리를 바이트 수로 반환합니다.
예를 들어, 파일 five.bin
을 만들어 보겠습니다.
A = 1:5; fid = fopen('five.bin','w'); fwrite(fid, A,'short'); fclose(fid);
fwrite
를 호출하면 short
형식이 지정되기 때문에 A
의 각 요소는 five.bin
에서 2바이트 저장 공간을 사용합니다.
읽기 목적으로 five.bin
을 다시 엽니다.
fid = fopen('five.bin','r');
파일 위치 표시자를 파일의 시작 부분에서 6바이트 앞으로 움직입니다.
status = fseek(fid,6,'bof');
그 다음 요소를 읽습니다.
four = fread(fid,1,'short');
읽기를 수행하면 파일 위치 표시자가 앞으로 이동합니다. 파일 위치 표시자의 현재 위치를 확인하려면 ftell:
을 호출하십시오.
position = ftell(fid) position = 8
파일 위치 표시자를 4바이트 뒤로 이동하려면 fseek
를 다시 호출하십시오.
status = fseek(fid,-4,'cof');
그 다음 값을 읽습니다.
three = fread(fid,1,'short');
다른 시스템에서 만든 파일 읽어오기
운영 체제마다 바이트 또는 비트 수준에서 정보를 저장하는 방식이 서로 다릅니다.
빅 엔디안 시스템은 가장 큰 주소의 바이트부터 메모리에 저장합니다(즉, 큰 쪽(big end)부터 시작합니다).
리틀 엔디안 시스템은 가장 작은 주소의 바이트부터 저장합니다(즉, 작은 쪽(little end)부터 시작합니다).
Windows® 시스템은 리틀 엔디안 바이트 순서를 사용하고 UNIX® 시스템은 빅 엔디안 바이트 순서를 사용합니다.
상반되는 엔디안 시스템에서 생성된 파일을 읽어오려면 파일을 생성할 때 사용한 바이트 순서를 지정하십시오. 순서는 파일을 열기 위해 호출할 때나 파일을 읽기 위해 호출할 때 지정할 수 있습니다.
예를 들어, 리틀 엔디안 시스템에서 생성되고 배정밀도 값을 가진, little.bin
파일이 있다고 가정해 보겠습니다. 이 파일을 빅 엔디안 시스템에서 읽어오려면 다음 명령 중 하나(또는 둘 다)를 사용하십시오.
다음과 같이 파일을 엽니다.
fid = fopen('little.bin', 'r', 'l')
다음과 같이 파일을 읽습니다.
mydata = fread(fid, 'double', 'l')
여기서 'l'
은 리틀 엔디안 순서를 나타냅니다.
현재 시스템에서 사용하는 바이트 순서를 잘 모르는 경우 computer
함수를 호출하십시오.
[cinfo, maxsize, ordering] = computer
ordering
이 'L'
이면 리틀 엔디안 시스템이고 'B'
이면 빅 엔디안 시스템입니다.