로우 레벨 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'이면 빅 엔디안 시스템입니다.