이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

로우 레벨 I/O를 사용하여 이진 데이터 가져오기

데이터를 가져오는 데 사용할 수 있는 로우 레벨 함수

로우 레벨 파일 I/O 함수를 사용하면 파일에서 데이터를 읽어오거나 파일에 데이터를 쓸 때 가장 직접적으로 제어할 수 있습니다. 그러나 이런 함수를 사용할 때는 사용이 쉬운 하이 레벨 함수에 비해 파일에 더 자세한 정보를 지정해야 합니다. 하이 레벨 함수와 이 하이 레벨 함수가 지원하는 파일 형식의 전체 목록을 보려면 가져오기와 내보내기에 지원되는 파일 형식 항목을 참조하십시오.

하이 레벨 함수가 데이터를 가져올 수 없는 경우 다음 중 하나를 사용하십시오.

  • fscanf - 텍스트 편집기에서 볼 수 있는 파일(텍스트 파일이나 ASCII 파일)에서 형식 지정된 데이터를 읽어옵니다. 자세한 내용은 형식 지정된 패턴의 데이터 읽어오기 항목을 참조하십시오.

  • fgetlfgets - 파일의 라인을 한 번에 하나씩 읽어옵니다. 여기서 각각의 라인은 새 줄(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형 클래스의 9x1 열 벡터로 읽어 들이려면 다음을 수행하십시오.

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 함수 도움말 페이지를 참조하십시오.

메모리 절약하기

기본적으로, freaddouble형 클래스로 구성된 배열을 생성합니다. 배열에 배정밀도 값을 저장하는 것은 문자나 정수, 단정밀도 값을 저장할 때보다 더 많은 메모리를 요합니다.

데이터 저장에 필요한 메모리 양을 줄이려면 다음 방법 중 하나를 사용하여 배열의 클래스를 지정하십시오.

  • 별표('*')를 사용하여 입력값 클래스를 일치시킵니다. 예를 들어, 단정밀도 값을 single형 클래스의 배열로 읽어오려면 다음 명령을 사용하십시오.

    mydata = fread(fid,'*single')
  • '=>' 기호를 사용하여 입력값을 새 클래스에 매핑합니다. 예를 들어, uint8 값을 uint16 배열로 읽어오려면 다음 명령을 사용하십시오.

    mydata = fread(fid,'uint8=>uint16')

정밀도 설명의 전체 목록을 보려면 fread 함수 도움말 페이지를 참조하십시오.

파일의 일부 읽어오기

MATLAB 로우 레벨 함수에는 파일의 이진 데이터의 일부를 읽을 수 있는 여러 가지 옵션이 있습니다.

파일의 끝 테스트하기

파일을 열면 MATLAB에서 파일 내 현재 위치를 나타내는 포인터가 생성됩니다.

참고

빈 파일을 열면 파일 위치 표시자가 파일 끝으로 이동하지 않습니다. 읽기 작업을 하거나 fseekfrewind 함수를 사용하면 파일 위치 표시자의 위치가 바뀔 수 있습니다.

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);

여기서

  • fidfopen에서 가져온 파일 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'이면 빅 엔디안 시스템입니다.

다양한 문자 인코딩으로 파일 열기

인코딩 체계는 일본어나 유럽어의 자모와 같은 특정 자모에 필요한 문자를 지원합니다. 일반 인코딩 체계에는 US-ASCII 또는 UTF-8이 포함됩니다.

인코딩 체계에 따라 char 값을 읽거나 쓰는 데 필요한 바이트 수가 결정됩니다. 예를 들어, US-ASCII 문자는 항상 1바이트를 사용하지만 UTF-8 문자는 최대 4바이트를 사용합니다. MATLAB은 지정된 인코딩 체계에 따라, 각 char 값에 필요한 바이트 수를 자동으로 처리합니다. 그러나 uchar 정밀도를 지정할 경우 MATLAB은 지정된 인코딩에 관계없이 각 바이트를 uint8형으로 처리합니다.

인코딩 체계를 지정하지 않으면 fopen은 시스템의 디폴트 인코딩을 사용하여 처리할 파일을 엽니다. 디폴트 값을 확인하려면 파일을 열고 다음 구문을 사용하여 fopen을 다시 호출하십시오.

[filename, permission, machineformat, encoding] = fopen(fid);

파일을 열 때 인코딩 체계를 지정하면 fscanf, fprintf, fgetl, fgets, fread, fwrite와 같은 함수는 해당 체계를 적용합니다.

지원되는 인코딩 체계의 전체 목록과 인코딩을 지정하기 위한 구문은 fopen 함수 도움말 페이지를 참조하십시오.