본문 바로가기
GameMaker강좌[GMS2]/GMS2기초강좌

[게임메이커강좌-기초][GMS2] 텍스트 파일 작성

by 타락카얀 2023. 2. 13.
728x90

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

◈ 텍스트 파일 작성

 

 

이번 강좌에서는 텍스트 파일을 작성하는 방법에 대해 알아보도록 합시다.

 

 

텍스트 파일의 쓰기와 읽기는 ini 파일 쓰기/읽기와 비슷하지만, 파일을 열 때부터 쓰기와 읽기를  구별하여

이벤트를 구성해야 합니다.

 

텍스트 파일의 쓰기는 먼저 기록할 텍스트 파일을 열고, 그 다음 데이터를 기록한 다음, 마지막으로 파일을

닫으면 됩니다.

 

읽기도 마찬가지입니다.

먼저 읽기를 시도할 텍스트 파일을 열고, 그 다음 데이터를 읽은 다음, 마지막으로 파일을 닫으면 됩니다.

 

다만, 텍스트 기록 기능은 ini 기록 방식과는 달리 특정 값을 찾거나 또는, 수정 및 추가하기가 힘든 구조입니다.

모든 데이터를 한번에 기록해야 하고, 값을 찾으려면 모든 데이터를 확인해야 하지요.

이 부분을 고려해 ini 방식이나 텍스트 방식을 나누어 사용하시는 것이 좋습니다.

 

 

텍스트 파일 열 때는 아래의 함수를 사용합니다.

 



   ● 쓰기 전용

   ◎ file_text_open_write(fname) : 텍스트 파일을 기록
   ◎ file_text_open_append(fname) : 지정 텍스트의 맨 끝부터 추가 기록




   ● 읽기 전용

   ◎ file_text_open_read(fname) : 텍스트 파일을 읽음

   ◎ file_text_open_from_string(string) : 문자열을 메모리에서 가상의 텍스트 파일로 읽음
                                                                   (실제 파일이 아님)


 

주의 할 것은 이미 말했지만, 텍스트 파일을 작성할 때 쓰기 전용으로 열 것인지, 읽기 전용으로

열 것인지를 구분하는 것이 중요합니다.

 

먼저 기록할 때는 텍스트를 처음부터 기록하는 방식(file_text_open_write)과, 기존에 있는

텍스트 데이터에 이어서 기록하는 방식(file_text_open_append) 2가지로 나뉩니다.

 

그리고 파일을 호출했다면 반드시 파일을 닫아야 합니다. 파일을 닫을 때는 아래의 함수를 사용합니다.

 


   ◎ file_text_close(fileid) : 텍스트 파일을 닫음

 

텍스트 파일은 보통 아래와 같은 형식으로 기록합니다.

 


   fn=file_text_open_write("example.txt"); ◀ ※ 중요 : 기록할 텍스트 파일을 열고,
                                                                         호출한 파일 id를 변수에 할당

   
        ...
   
   < 호출한 파일 id에 데이터를 기록 >
   
        ...
   
   file_text_close(fn); ◀ ※ 중요 : 호출한 파일을 닫는다


 

이것은 기록할 텍스트 파일을 열고, 호출한 파일 id를 변수에 할당한 후, 그 변수를 사용해 데이터를

기록하는 방식입니다.

 

텍스트 파일을 작성시 file_text_open_write 함수로 작성하고자 하는 텍스트 파일을 생성하고,

이미 파일이 있다면 기록하기 위해 파일을 여는 역할을 합니다.

그리고 작성이 끝나면 file_text_close 함수로 작성하고 있는 파일을 닫습니다.

 

주의 해야 할 부분이 있는데 메모리로 로드하여 작업하기 때문에 파일일 열었다면,

무조건 file_text_close 함수로 마지막에 파일을 닫아야 합니다. 그렇지 않으면 메모리 누수가 발생해요.

 

 

파일을 기록할 때는 아래의 함수를 사용합니다.

 


   ◎ file_text_write_real(fileid,x) : 숫자를 기록
   ◎ file_text_write_string(fileid,str) : 문자열을 기록
   
   ◎ file_text_writeln(fileid) : 기록할 다음 줄로 이동(개행)


 

기록할 때는 문자열과 숫자를 구분하여 기록해야 합니다.

그리고 데이터를 작성할 때, 다음 줄로 이동하여 기록 하고 싶다면 file_text_writeln를 사용하고 데이터를

 

기록하면 됩니다.

 


   예) fileid 는 파일을 열었을 때, 호출한 파일 id 를 말함. 보통 변수에 저장 후 사용.
   
   
   var fileid=file_text_open_write("example.txt");
   
   file_text_write_real(fileid,global.player_score); //현재 줄에 데이터를 기록
   file_text_writeln(fileid); //다음 줄로 이동
   
   file_text_close(fileid);


 

텍스트 파일 읽기는 기록할 때처럼 아래와 같은 형식으로 읽습니다.

 


   fn=file_text_open_read("example.txt"); ◀ ※ 중요 : 읽을 텍스트 파일을 열고,
                                                                     호출한 파일 id 를 변수에 할당
   
        ...
   
   < 호출한 파일 id에서 데이터를 읽음 >
   
        ...
   
   file_text_close(fn); ◀ ※ 중요 : 호출한 파일을 닫는다


 

데이터를 기록할 때는 문자열로 기록할 때 텍스트 줄을 생각할 필요 없이 미리 텍스트를 구성하여

기록할 수 있지만, 데이터를 읽을 때는 한 줄씩 읽어야 해요.

 

파일을 읽을 때는 아래의 함수를 사용합니다.

 


   ◎ file_text_read_real(fileid) : 숫자를 읽음
   ◎ file_text_read_string(fileid) : 문자열을 읽음
   
   ◎ file_text_readln(fileid) : 텍스트를 읽을 다음 줄로 이동(개행)


 

기록할 때와 마찬가지로 문자열과 숫자를 구분하여 텍스트를 읽어야 합니다.

그리고 다음 줄을 읽어야 할 때는 먼저 file_text_readln를 사용하여 다음 줄로 넘어간 후,

데이터를 읽으면 됩니다.

 



   var fileid=file_text_open_read("example.txt");
   
   global.text=file_text_read_string(fileid); //현재 줄의 데이터를 읽음
   file_text_readln(fileid); //다음 줄로 이동
   
   file_text_close(fileid);

 

텍스트를 읽을 때, 모든 데이터를 읽었는지 확인할 필요가 있는데, 아래 함수를 사용하면 모든 데이터를

읽어 텍스트의 끝에 도달했는지 확인할 수 있습니다.

 


   ◎ file_text_eof(fileid) : 텍스트의 맨 끝에 도달하였는지를 체크.
                                   끝에 도달했다면 true,그렇지 않다면 false를 반환
                                   
                                  ※ 텍스트의 마지막 줄이 비었거나, 마지막 줄에 내용이 있는 경우
                                   마지막 줄을 읽어야 끝에 도달한 것으로 처리합니다.


 

함수는 텍스트 데이터를 마지막 부분까지 읽었을 때 텍스트의 마지막 줄이 비었거나, 마지막 줄에 내용이

있는 경우 마지막 줄을 읽어야 끝에 도달한 것으로 처리합니다.

 


   var num = 0;
   var file = file_text_open_read(working_directory + "Game_Data.txt");
   while (!file_text_eof(file))
   {
       str[num++] = file_text_read_string(file);
       file_text_readln(file);

   }
   file_text_close(file);


 

아래 함수는 텍스트 현재 줄의 끝에 도달하였는지 확인할 수 있습니다.

 


   ◎ file_text_eoln(fileid) : 텍스트 현재 줄의 끝에 도달하였는지 체크.
                                    끝에 도달했다면 true, 그렇지 않다면 false를 반환
                                   
                                  ※ 텍스트에서 현재 줄을 읽은 후, 다음 줄로 넘어가지 않았거나,
                                   현재 줄에서 읽을 문자열이 없는 경우 true 를 반환


 

함수는 텍스트에서 현재 줄을 읽은 후, 다음 줄(file_text_readln 사용해서)로 넘어가지 않았거나,

또는, 현재 줄에서 읽을 문자열이 없는 경우 true 를 반환합니다.

 


   var file = file_text_open_read(working_directory + "Game_Data.txt");
   var num = 0;
   while (!file_text_eoln(file))

   {
       score_array[num] = file_text_read_real(file);
       file_text_readln(file);

       num++;
   }
   file_text_close(file);


 

file_text_open_from_string 함수는 문자열로부터 메모리에서 가상의 텍스트 파일을 만들고,

읽기 전용으로 열어 읽기 전용 텍스트 함수를 통해 데이터를 읽을 수 있도록 합니다.

 


   ◎ file_text_open_from_string(string)

 

file_text_open_read 함수는 실제 파일로부터 텍스트를 읽지만, file_text_open_from_string 함수는

실제 파일이 아닌 문자열로부터 가상의 텍스트 파일 형식을 읽는 것이라고 보시면 됩니다.

텍스트 형식으로 기록된 문자열로부터 file_text_open_from_string 함수를 사용하여 가상의 텍스트파일로 열면,

file_text_open_read 함수로 읽기 전용으로 열고 데이터를 읽을 때처럼, 읽기 전용 텍스트 함수를 사용하여

데이터를 읽으면 됩니다.

 

이 파일은 임시 파일(실제로 생성되는 파일이 아님)이며 읽기 전용이므로 파일을 닫는 순간 메모리에서 제거됩니다.

 

※ [참고]: 한 번에 최대 32개의 파일만 열 수 있습니다. 데이터를 쓰고 파일과 관련된 메모리를 해제하므로 작업이 끝나면 파일을 항상 닫아야 합니다.

 


   예) 문자열로부터 텍스트 파일 형식으로 읽기
  
  
   var example_str="5"+"\n"+"Hello, World!";


   var fileid=file_text_open_from_string(example_str);
   
   global.text[0]=file_text_read_string(fileid); //현재 줄의 데이터를 읽음( 5 )
   file_text_readln(fileid); //다음 줄로 이동


   global.text[1]=file_text_read_string(fileid); //현재 줄의 데이터를 읽음( Hello, World! )
   
   file_text_close(fileid);
   
   
   
   ※[참고] '\n' 은 텍스트에서 다음 줄로 이동하는 키워드입니다.
      멀티 라인으로 작성시 텍스트 앞에 기호 '@'를 붙여 아래와 같이 작성할 수도 있습니다.
   
     example_str=@"5
     Hello, World!
     ";
   
   ※ 멀티 라인 작성시 게임메이커 코딩에서 엔터를 치면 앞에 공백이 붙을 수 있기 때문에
       텍스트 앞의 공백을 지워주는 것이 좋습니다.



 

또한 아래 함수를 사용하면 지정한 파일이 있는지도 체크할 수 있습니다.

 


   ◎ file_exists(fname) : 지정한 파일이 있는지 체크. 있을 경우 true, 없다면 false 를 반환

 

텍스트 파일을 읽을 때는 읽을 파일이 없는 경우 오류가 날수 있기 때문에 파일이 있는지

체크하는 것이 좋습니다.

 


   if file_exists("example.txt"){


   var fileid=file_text_open_read("example.txt");
   
   global.text=file_text_read_string(fileid);
   file_text_readln(fileid);
   
   file_text_close(fileid);
   
   }


 

 

 

 

 

300x250

댓글