반응형
Recent Posts
Recent Comments
Link
관리 메뉴

공머씨의 블로그

내가 공부한 옥타브2 19. 파일 입출력 본문

내가 공부한 옥타브(매틀랩)/내가 공부한 옥타브 시리즈2 (공업수학1)

내가 공부한 옥타브2 19. 파일 입출력

공머씨 2020. 4. 26. 22:27
반응형

파일 입출력을 다루는 방법에 대해서 공부하겠습니다. 

 

save명령과 load명령을 사용해서 실습을 해보겠습니다. 

 

m파일과는 다른 기능인데요, (m파일은 matlab script 저장 파일)

command window에 어떤 변수들을 아래와 같이 입력했습니다.

 

 

 

 

 

잠깐 저장을 하고 싶다면

save명령어를 사용해서 저장하면 됩니다. 

save mydatafile

위와 같이 하면 저장이 됩니다. 

mydatafile의 script를 직접 눈으로 볼순 없지만 Filebrower을 보니 저장이 되었음을 볼 수 있습니다.

 

옥타브를 껐다가 켜면 WorkSpace에 저장된 변수가 없음을 알 수 있습니다. 

 

File Browser에는 파일이 그대로 있는 것도 볼 수 있습니다. 

 

 

 

파일에 저장한 뒤 저장한 변수를 불러오기 위해서는 load (파일명) 변수를 사용해야 합니다.

 

WorkSpace를 보면 아까 'mydatafile'라는 파일에 저장했던 변수들이 나온 것을 볼 수 있습니다. 

 

그런 다음 저장했던 변수를 입력하면 

변수를 불러올 수 있습니다. 

 

만약 이때 어떤 변수를 저장했는지 기억이 나지 않는다면

who명령어를 사용하면 됩니다.

 

다음 화면과 같이 save myfile에 save 했던 변수들이 어떤 것이 있었는지 볼 수 있습니다. 

 

바탕화면에도 저장이 되어있는 것을 볼 수 있습니다. 

그러고 나서 

 

 

만약 특정한 변수만 저장하고 싶다면  save mydata x y

라고 입력해주면 됩니다. 

mydate라는 이름으로 파일이 저장됩니다. 

이때 변수 x, y만  저장됩니다.

 

 

창을 껐다가 켰다고 가정하기 위해 clear all을 사용해서 WorkSpace에 있는 변수들을 일단 모두 지워줍니다.

 

clear  all 은 메모리에 있는 변수들을 다 지우는 기능을 합니다. 

왼쪽의 worksapace에 변수들이 다 지워진 것을 볼 수 있습니다. 

FileBrowser은 그대로입니다.

 

 

 

load명령을 이용해서 mydata 파일을 불러오겠습니다. 

workspace에 mydata에 있는 변수들이 생긴 것을 볼 수 있습니다. 

 

 

 

 

 

또 다른 예시로  행렬을 A라는 변수에 저장해보도록 하겠습니다. 

 

 

아까처럼 매트랩 고유 형식의 데이터 파일로 저장해보겠습니다. 

이번에는 눈으로 볼 수 있도록 아스키 텍스트 파일로 저장해보겠습니다. 

save (파일 이름). txt A -ascii

와 같은 명령을 입력해줍니다. (A라는 행렬 뒤에 -기호를 작성할 때 한 칸 띄어줘야 합니다.)

(확장자 txt는 생략해도 상관없다고 하셨는데 저 같은 경우는 생략하니 파일이 열리지가 않았습니다.)

 

위 그림과 같이 FileBrowser에 확장자가 txt인 파일로 저장됨을 볼 수 있습니다. 

 

 

 

파일을 열어보면 다음과 같이 어떤 변수들이 저장되었는지 볼 수 있습니다. 

 

 

그 다음 text파일을 다시 불러서 읽습니다.

아까는 loadmyfile 라고 작성해서 파일을 부르고 저장된 값을 읽어 들였는데

지금은 매트랩 데이터 파일이 아니라 아스키 파일로 저장되어 있기 때문에

format에  맞도록 불러와서 저장해야 합니다. 

 

 

파일을 불러옵니다. 

불러온 파일을 그 변수를 A에 집어넣어라 라고 명령할 수 있습니다. 

다른 변수에도 대입할 수 있습니다. 

 

 

 

다음 두 명령은 같은 효과를 냅니다. 

 

save datafile.txt A –ascii          % 명령 형태 

 save( ‘datafile.txt’ , ’A’, ‘-ascii’ )  % 함수 호출 형태

 

 

 

save를 사용해서 변수를 저장하고 load를 사용해서 변수를 불러들이는 과정을 공부해보았습니다. 

save와 load는 매트랩 형식으로 저장할 때 쓰이는 명령입니다. 

 

 

 

 

 

다음으로 fprintf에 대해서 알아보겠습니다. 

 

이 명령은 특정한 형식을 지정해서 저장하고 싶을 때 fprintf를 사용합니다.

c언어를 공부했다면 printf와 같은 기능을 하는 함수라고 생각하면 되겠습니다. 

 

다음과 같은 형식으로 작성해주면 됩니다. 

>> x=3;
>> x
x =  3
>> fprintf("x=%d\n", x)
x=3

fprintf에서 x=이라는 글자는 그대로 찍히고 ""뒤에 있는 x가 format % d를 가지고 출력됩니다. 

그림으로 그려서 설명하면 다음과 같습니다. 

 

 

 

만약 다음과 같은 행렬에 줄 바꿈 문자를 넣어서 fprintf함수로 나타내면 다음과 같겠습니다. 

 

x에는 값이 4개 들어있으므로 위와 같이 출력됩니다. 

 

 

이번에는 벡터가 아닌 행렬을 입력, 출력해보겠습니다. 

행렬A를 다음과 같이 정의해줍니다.

 

A=[1 2 3 4 5 6]

% d앞에 아무것도 작성하지 않고 엔터를 누르면

아래 사진과 같이 

6줄을 찍게 될 것입니다. 

 

출력되는 순서를 보니까 

열을 먼저 가져오고 그 다음에 벡터를 가져온다는 사실을 알 수 있습니다.

 

 

 

 

 

2개씩 출력하고 줄을 바꾸고 싶다면 다음과 같은 형식으로 함수를 작성하면 되겠습니다. 

 

다음과 같이 한 번에 두 개의 숫자를 찍게 되면 마치 행 과열을 바꾼 것처럼 나옵니다.  열을 먼저 출력하고 행을 출력하기 때문입니다.

 

 

 

 

 

 

 

이렇게 출력을 할 수 있는데  15과에서는 명령 창에 출력하는것이 학습목표가 아니라

파일 형식으로 출력하는 것이 중요합니다.

 

Data형식으로 출력할 때는 fprintf함수를 사용할 수 있는가 하는 내용이 강의노트에 있습니다.

 

다만 format string앞에 어떤 파일에 찍을 것인지를 나타내는 '파일 핸들'을 입력해주면 되겠습니다. 

 

 

 

 

냉장고에 있는 음식을 먹으려면 냉장고 문을 연다.

냉장고에 음식을 집어넣는다. 

냉장고 문을 닫는다. 

 

 

파일을 여는 명령은 fopen 

파일을 닫는 명령은 fclose

파일에 작성하는 명령은 fpritnf입니다. 

A라는 행렬의 값을 만들기 전에 저장할 데이터를 만들어줍니다. 

이번에 script를 만들라고 했으니 Ediotor로 가서 다음과 같이 입력해줍니다. 

 

 

 

fid:file id의 줄임말입니다.

 

 

fprintf(fid, '')

어디에 쓰는지 어떤 형식으로 쓰는지 (총7칸, 소수점 아래는 4자리까지 표기)

 

fclose(fid)

fclose()는 fid라는 핸들을 가진 파일이 닫힌다는 명령입니다. 

 

fid가 파일의 핸들이 됩니다.

 

전체 코드와 실행화면입니다. 

clear;clc;close all;
%파일에 저장할 데이터 만들기
%예제 15a번에 대한 내용입니다. 

t=[0:0.01:1]; %시간 t의 범위를 0과 1사이로 잡습니다. 
y=cos(2*pi*t); 
A=[t;y] %편리하게 사용하기위해서 행렬에다가 대입해봅니다. 
%첫번째 행에는 t를 두번째 행에는 y를 대입합니다. 

fid=fopen('myfile1.txt','w'); %w는 written의 약자로,쓰기파일로 열겠다는 명령입니다. 
%이런 이름을 가진 파일을 출력한다음 성공하면 그 파일의 핸들,아이디를 fid라는 변수에 
%반환해줍니다. 

fprintf(fid,"%7.4f ;%7.4f \n",A); %어디에 쓸지, 어떤 형식으로 쓸지
%7.4f > float형식으로,총7자리까지 표시하되,소수점 아래 숫자는 4자리까지 표기한다.
fclose(fid)

FileBrowser에 보면  myfile1.txt라는 이름을 가진 텍스트 파일이 생성되어있음을 볼 수 있습니다. 

 

 

마우스 우클릭 해서 

두 번째 있는 칸인 Open in Text Editor을 클릭하면 됩니다.

또는 더블클릭해서 열어줄 수도 있습니다. 

다음과 같은 화면이 나옵니다. 

 

 

 

 

데이터를 저장했으니 데이터를 읽어오는 것이 필요합니다. 

데이터를 읽어오려면 일단 파일을 열어야 합니다.

fid=fopen('myfile1.txt','r')

''안에는 열고 싶은 파일이름 'r' >>읽기 형식으로 열기위해서...

파일의 핸들,id는 변수fid에 저장되어있습니다.

 

읽어오려면fscanf(fid,)

fscanf() 함수에 대해 공부합니다. 

 

 

그 파일의 핸들은 fid에 저장되어 있습니다.

% g라는 형식은 general의 약어입니다. 

아무 형식으로나 읽어온다는 뜻입니다. 

fid=fopen('myfile1.txt', 'r'); 읽기 형식으로 연다.

 

두번쨰 열에는 ; 이라는 문자하나가 저장되어있다는 것을 알고 있기 때문에 %c로 읽습니다.

% c는 character이라는 뜻 문자 하나를 읽어옵니다. 

세번째열에는 숫자가 들어있으므로 형식에 상관없이 숫자를 무조건 읽어오라는 의미입니다.

 

 

두 번의 콤마를 찍은 다음 나오는 

세 번째 인자는 읽어오는 범위를 나타냅니다. 

[3 inf]

3행부터 infinite(끝까지)라는 뜻입니다.

 

어디다가 저장할지에 대한 코드를 입력해보겠습니다. 

fscanf앞에 A=을 작성하여 A에 대입한다는 뜻을 나타냅니다. 

 

 

읽어오는 것에 대한 코드를 작성했으므로 

파일을 닫아주면 됩니다. 

fclose(fid)라고 

 작성해주면 됩니다.

 

 

전체 코드와 출력 화면입니다. 

%% 

%파일읽어오기에 대한 코드입니다 .
fid = fopen( 'myfile1.txt' , 'r' ); %read 읽기형식으로 연다.
fscanf(fid, '%c %c %c', [3 1]);  % 첫 줄 비우기
A = fscanf(fid, '%g %c %g', [3 inf]);  %3행으로 끝까지
fclose(fid);

A=A';      %전치행렬 3행에서 3열으로 바뀌었다.
t=A(:,1);  %1열에 데이터가 들어있다. 
y=A(:,3);  %3열에 있는 데이터를 모두 y에 대입하라는 뜻 입니다.    
plot(t,y)

 

마지막 3줄을 다음과 같이 작성해도 됩니다.

%ex15b
%파일읽어오기에 대한 코드입니다 .
fid=fopen('myfile1.txt','r');
A=fscanf(fid,'%g %c %g',[3 inf]);  
fclose(fid);

t=A(1,:)
y=A(3,:)
plot(t,y)

 

 

 

데이터 출력하는 방법과 

출력한 데이터를 파일로 읽어 들일 수 있게 되었습니다. 

 

 

사용자가 정확히 정수를 입력한다고 가정해서 

만약 음수가 들어오면 -부호를 제거하는 파일을 불러옵니다.

그런 프로그램을 짜 봅니다. 

 

힌트

무한히 반복하므로 while(1)이라는 코드를 작성하였습니다. 

 

둘 다 아니면 break

while루프 밖으로 빠져나가라는 뜻입니다. 

 

 

입력되는 n값에 따라서 파일 이름이 바뀌도록 하였습니다. 

 

-5를 입력하면 mydata5라는 파일에서 변수를 읽어 들입니다.

 

 

 

전체코드와 결과화면 입니다.

while(1)
N=input('Enter an integer:');

if((0<N) && (N<=10))  
  t=[0:0.01:1];
  y=exp(-N*t);   % y값 계산
  z=sin(pi*N*t);   % z값 계산
  A=[t;y;z];   % t, y, z 를 A의 1행, 2행, 3행으로
  filename=strcat('mydata',int2str(N));  % 쓸 파일명
  fid=fopen(filename,'w');    % 파일 열기
  fprintf(fid,'%f %f %f\n',A);  % 파일에 쓰기  
  fclose(fid);                     % 파일 닫기

elseif((-10<=N) && (N<0))                                  
  filename=['mydata' int2str(-N)]; % 읽을 파일명
  fid=fopen(filename,'r')           % 파일 열기
  B=fscanf(fid,'%g %g %g',[3 inf]); % 파일로부터 읽기
  fclose(fid);        % 파일 닫기
  
  t1=B(1,:); % t값
  y1=B(2,:); % y값
  z1=B(3,:); % z값
  
  figure; % 새 그림창을 열기
  subplot(1,2,1);  plot(t1,y1) ; 
  title(['data in file ' filename]);
  
  subplot(1,2,2);  plot(t1,z1) ; 
  title(['data in file' filename]);
  gtext('20191015 ParkGyuBin','FontSize',20);
  
elseif (N==0)
 break;  
 
end

end

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
Comments