FileSeek

이 함수는 지정된 포지션을 기준으로 파일 포인터의 포지션을 지정된 바이트 수만큼 이동합니다.

bool  FileSeek(
   int                  file_handle,     // 파일 핸들
   long                 offset,          // 바이트 단위
   ENUM_FILE_POSITION   origin           // 레퍼런스용 포지션
   );

Parameters

file_handle

[in] FileOpen()에서 반환된 파일 설명자.

offset

[in] 바이트 이동(음수 값이 될 수 있음).

origin

[in] 변위의 시작점. ENUM_FILE_POSITION 열거값 중 하나일 수 있습니다.

반환 값

성공하면 함수는 true를 반환하고 그렇지 않으면 false를 반환합니다. 오류에 대한 더 많은 정보에 대해선 GetLastError() 함수를 호출하십시오.

참고

FileSeek() 함수를 실행하면 파일의 "레벨 경계"를 벗어나는 음의 이동이 발생하는 경우 파일 포인터가 파일 시작 부분으로 설정됩니다.

위치가 파일의 "오른쪽 경계"를 벗어나 설정된 경우(파일 크기보다 큼), 다음 번 파일 쓰기는 파일 끝이 아니라 포지션 세트에서 수행됩니다. 이 경우 이전 파일 끝과 포지션 세트에 대해 무한값이 기록됩니다.

예:

//+------------------------------------------------------------------+
//|                                                Demo_FileSeek.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- 스크립트를 시작할 때 입력 매개 변수 창을 표시합니다
#property script_show_inputs
//--- 입력 매개 변수
input string InpFileName="file.txt";    // 파일명
input string InpDirectoryName="Data";   // 디렉토리명
input int    InpEncodingType=FILE_ANSI// ANSI=32 또는 UNICODE=64
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 난수 생성을 위한 변수 값 지정
   _RandomSeed=GetTickCount();
//--- 문자열의 시작점 위치에 대한 변수
   ulong pos[];
   int   size;
//--- 에러값 리셋
   ResetLastError();
//--- 파일 열기
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("%s 파일을 읽을 수 있습니다",InpFileName);
      //--- 파일의 각 문자열에 대한 시작 위치 수신
      GetStringPositions(file_handle,pos);
      //--- 파일의 문자열 수 정의
      size=ArraySize(pos);
      if(!size)
        {
         //--- 파일에 문자열이 없으면 중지
         PrintFormat("%s 파일이 비었습니다!",InpFileName);
         FileClose(file_handle);
         return;
        }
      //--- 문자열 수를 무작위로 고름
      int ind=MathRand()%size;
      //--- 위치를 문자열의 시작점으로 이동
      if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
        {
      //--- ind 숫자로 문자열을 읽고 인쇄합니다.
         PrintFormat("%d 번호 포함 문자열 텍스트: \"%s\"",ind,FileReadString(file_handle));
        }
      //--- 파일 닫기
      FileClose(file_handle);
      PrintFormat("%s 파일이 닫혔습니다",InpFileName);
     }
   else
      PrintFormat("%s 파일 열기 실패, 에러 코드 = %d",InpFileName,GetLastError());
  }
//+-------------------------------------------------------------------------------+
//| 함수는 파일의 각 문자열에 대한 시작 지점을 정의하고  |
//| 배열에 배치합니다                                                      |
//+-------------------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
  {
//--- 디폴트 배열 사이즈
   int def_size=127;
//--- 배열용 메모리 할당
   ArrayResize(arr,def_size);
//--- 스트링 카운터
   int i=0;
//--- 파일의 끝이 아니라면 문자열이 하나 이상 있습니다
   if(!FileIsEnding(handle))
     {
      arr[i]=FileTell(handle);
      i++;
     }
   else
      return// 파일이 비었습니다, exit
//--- 인코딩에 따른 바이트 이동 정의
   int shift;
   if(FileGetInteger(handle,FILE_IS_ANSI))
      shift=1;
   else
      shift=2;
//--- 루프에서 문자열을 통과
   while(1)
     {
      //--- string 읽기
      FileReadString(handle);
      //--- 파일의 끝 점검
      if(!FileIsEnding(handle))
        {
         //--- 다음 문자열의 위치를 저장
         arr[i]=FileTell(handle)+shift;
         i++;
         //--- 오버플로인 경우 어레이의 크기를 증가
         if(i==def_size)
           {
            def_size+=def_size+1;
            ArrayResize(arr,def_size);
           }
        }
      else
         break// 파일의 끝, exit
     }
//--- 배열의 실제 사이즈 정의
   ArrayResize(arr,i);
  }