파일 작업. - 페이지 4

 

TheXpert :

어머나! 결론은 일반적으로 광기입니다. 이것은 "OOP가 더 빠름" 또는 "지표가 느립니다. 모든 코드를 전문가 고문에게 전송해야 합니다"와 같은 응용 프로그램이 나중에 나타나는 방식입니다.

예, 모든 것이 의도한 대로 작동하지 않는다는 것을 이해합니다. 적어도 FileFlush()의 일반적인 사용은 FileClose()보다 눈에 띄게 빨라야 합니다.

지금은 그러한 것들을 사이클 안에 집어넣을 가치가 없는 것 같습니다. 어쨌든 별로 도움이 되지 않을 것입니다.

그리고 내가 MQL4에 대한 예를 올바르게 이해 했다면 FileFlush() 호출 이 두 사이클 사이에 위치합니다(이는 이것이 정확히 사이클의 브레이크라는 생각으로 이어졌습니다).

   int bars_count= Bars ;
   int handle= FileOpen ( "mydat.csv" , FILE_CSV | FILE_WRITE );
   if (handle> 0 )
    {
     FileWrite (handle, "#" , "OPEN" , "CLOSE" , "HIGH" , "LOW" );
     for ( int i= 0 ;i<bars_count;i++)
       FileWrite (handle, i+ 1 ,Open[i],Close[i],High[i], Low[i]);
     

FileFlush (handle);

     ...      for ( int i= 0 ;i<bars_count;i++)        FileWrite (handle, i+ 1 ,Open[i],Close[i],High[i], Low[i]);      FileClose (handle);     }

따라서 개발자의 논리를 올바르게 이해했다면 기본 클래스의 OnInit / Constructor(생성자뿐만 아니라 가능) 에서 파일을 열고 기본 클래스의 OnDeint / Destructive에서 파일을 닫아야 합니다.

다른 모든 경우에는 FileClose 대신 FileFlush를 사용합니다( FileWrite 이후 및 주기 이후 ).


 

TheXpert :

예델킨 :

동시에 문서에 따라 줄을 바꿨습니다.

         FileFlush (handle_file);
         FileWrite (handle_file,t);

이것은 문서의 어디에 기록되어 있습니까?

MQL5 참조 에는 다음과 같은 문구가 있습니다.

파일플러시

메모

FileFlush() 함수는 파일 읽기와 파일 쓰기 사이에 호출되어야 합니다.

"파일에 쓰기" == FileWrite() 함수인 경우 " FileFlush() 함수는 FileWrite() 함수 보다 먼저 호출되어야 합니다." 아니면 다른 의견이 있습니까?

더엑스퍼트 :

예델킨 :
그러나 아직 FileWrite() 전에 FileFlush()를 호출하는 요점을 파악하지 못했습니다.

그것이 없는 것의 의미를 어떻게 이해할 수 있습니까? 라인의 순서를 고국으로 되돌리고 다시 확인하십시오. 분명히 문서가 정확하지 않습니다.

새로운 자료를 공부할 때 어떤 것이 말이 되고 어떤 것이 그렇지 않은지 미리 알면 좋습니다. 자연은 우리에게 그러한 재능을 보상하지 않았기 때문에 우리는 "싸움을 통해 새로운 높이에 도달"하고 문서 및 결과를 테스트하고 해석해야 합니다. 테스트 자체가 올바르게 작성되었는지조차 확실하지 않습니다. 처음에는 직관적으로 FileWrite() 뒤에 FileFlush()를 넣었지만, Directory를 다시 읽고 나서 그 예제를 삭제했습니다.

더엑스퍼트 :

흥미로운 :

어머나! 결론은 일반적으로 광기입니다. 이것은 "OOP가 더 빠름" 또는 "지표가 느립니다. 모든 코드를 전문가 고문에게 전송해야 합니다"와 같은 응용 프로그램이 나중에 나타나는 방식입니다.

각 평가 후에 "당신의 결론은 미친 짓입니다"라는 바로 그 미친 짓이 무엇인지에 대한 설명이 있었다면 좋았을 것입니다 :) 그렇지 않으면, 사법부의 그러한 엄격함과 함께 호기심을 가져야 할 방향이 어떻게 든 불분명합니다 :)

 
TheXpert :

변경 사항이 나타나기 전에 깜박이는 것은 의미가 없습니다. 그들은 아직 존재하지 않습니다 :)

믿기지 않으시겠지만, 그 이전의 문서를 참고하여 "하지만 FileWrite( ) 전에 FileFlush()를 호출한다는 점을 아직 이해하지 못했다"라고 쓴 것도 그런 이유에서였습니다. 그러나 모든 문서 라인에 의문을 제기하는 것 - 뻔뻔함과 지식으로는 아직 충분하지 않습니다. :)
... 일반적으로 과정은 명확합니다. 특정 문제가 실제로 발견되면 개발자가 말할 것을 기다리고 있습니다.
 
Yedelkin :

MQL5 참조 에는 다음과 같은 문구가 있습니다.

"파일에 쓰기" == FileWrite() 함수인 경우 " FileFlush() 함수는 FileWrite() 함수 보다 먼저 호출되어야 합니다." 아니면 다른 의견이 있습니까?

MQL4에 대한 이 기능의 "매우 불운" 설명과 예를 분석해 보겠습니다.

무효 FileFlush ( int 핸들)


I/O 파일 버퍼에 남아 있는 모든 데이터를 디스크로 플러시합니다.

참고: FileFlush() 함수는 파일 읽기와 파일 쓰기 사이에 호출되어야 합니다.
파일을 닫으면 데이터가 디스크에 자동으로 플러시되므로 FileClose() 함수를 호출하기 전에 FileFlush() 함수를 호출할 필요가 없습니다.

여기에 강조 표시된 줄은 파일에 쓰기 전에 루프에서 FileFlush를 호출 해야 하는 필요성에 대한 인수로 제공됩니다.

그러나 이 말을 문자 그대로 받아들이면 다음과 같은 결과를 얻을 수 있습니다.

FileFlush() 함수는 파일에서 읽는 작업(읽는 것을 FileReadXXX라고 함) 과 파일에 쓰는 작업 (FileWrite 및 FileWriteXXX는 쓰기와 연결됨) 사이에 호출되어야 합니다.

파일이 닫힐 때 (읽기 - FileClose가 실행될 때) 데이터가 자동으로 디스크에 플러시됩니다 (읽기 - FileFlush가 자동으로 수행됨).


내 생각에 개발자들은 MQL4 버전에서도 도움말을 제대로 읽는 것에 크게 신경을 쓰지 않았고, 잘린 부분을 MQL5로 옮기는 이야기를 하는 것은 어리석은 일이다.

내 생각에 여기에 주어진 발언의 적어도 두 번째 문장은 다음과 같아야 합니다.

데이터는 파일이 닫히기 전에 자동으로 디스크로 플러시 되므로 FileClose() 함수를 호출하기 전에 FileFlush() 함수를 호출할 필요가 없습니다.

이것도 약간 엉성하지만 특정 관점에서 보면 FileClose 로 파일을 닫기 전에 FileFlush를 사용하지 말아야 하는 이유를 더 명확하게 설명합니다.


예를 들어도 모든 것이 그렇게 단순하지는 않습니다. 텍스트는 한 가지(읽기 작업과 쓰기 작업 사이의 사용)에 대해 작성되었으며 예제에서는 두 쓰기 사이클 사이의 사용을 설명합니다(그런데 사이클 내부 작업은 고려되지 않습니다. 도움말에서 전혀).

따라서 최소한 다음을 추가해야 합니다.

1. 이 I/O 버퍼가 무엇이고 파일 열기, 데이터 블록 읽기, 데이터 블록 쓰기 및 파일 닫기 사이에 실제로 일어나는 일에 대한 설명.

이것은 파일 작업에 대한 전체 섹션에 적용될 가능성이 큽니다.

2. 파일에 한 번 액세스할 때 FileFlush 호출을 올바르게 사용하는 방법(예: 타이머에 값 쓰기)에 대한 일반적으로 이해되는 예(클래스를 기반으로 할 수 있음)를 제공합니다.

3 배열로 작업할 때 호출의 일반적인 예를 들어 보십시오. 내가 이해하는 한, MQL4 도움말에 설명된 예제는 대형 어레이 작업과 관련되어 있지만 동시에 잘못 설명되어 있습니다(한 마디로, 가능하다면 파일에 다소 많은 양의 동일한 데이터를 두 번 쓰는 이유는 여러 번 수행해야합니까?).

FileFlush - Документация на MQL4
  • docs.mql4.com
FileFlush - Документация на MQL4
 
Interesting :

여기에 강조 표시된 줄은 파일에 쓰기 전에 루프에서 FileFlush를 호출 해야 하는 필요성에 대한 인수로 제공됩니다.

그러나 이 말을 문자 그대로 받아들이면 다음과 같은 결과를 얻을 수 있습니다.

FileFlush() 함수파일에서 읽는 작업(읽는 것을 FileReadXXX라고 함) 과 파일에 쓰는 작업 (FileWrite 및 FileWriteXXX는 쓰기와 연결됨) 사이에 호출되어야 합니다.

파일이 닫힐 때 (읽기 - FileClose가 실행될 때) 데이터가 자동으로 디스크에 플러시됩니다 (읽기 - FileFlush가 자동으로 수행됨).

나는 생각의 기차를 이해했다. 나는 무지에서 "파일에서 읽기" 작업을 FileOpen() 함수와 동일시했음을 고백합니다(내 EA는 틱 및 사용자 이벤트를 처리할 때 OnInit()에서 읽기만 합니다. 주기의 FileReadXXX() 유형은 고려되지 않았습니다. 그러나 FileWriteXXX() 이전의 FileFlush() - 원칙은 두 참고서에서 동일합니다. ..네. 그것은 고전적인 의미의 논증이 아니라(내 입장을 정당화하기 위한 것입니다), 내가 왜 그 문구를 겁에 질려 썼는지에 대한 질문에 대한 답변이었습니다.

일반적으로 개발자가 여기에 응답하지 않으면 저녁에 토론 및 중간 결과에 대한 링크가 포함된 요청을 작성합니다. 1) "버그는 버그가 아닙니다" 및 2) 문서의 변경이라는 두 가지 응용 프로그램이 필요합니다. 주제를 너무 깊이 파고 들었으므로 두 번째 지원서를 직접 작성하시겠습니까?

 
Yedelkin :

나는 생각의 흐름을 이해했다. 나는 무지에서 "파일에서 읽기" 작업을 FileOpen() 함수와 동일시했음을 고백합니다(내 EA는 틱 및 사용자 이벤트 를 처리할 때 OnInit()에서 읽기만 합니다. 주기의 FileReadXXX() 유형은 고려되지 않았습니다. 그러나 FileWriteXXX() 이전의 FileFlush() - 원칙은 두 참고서에서 동일합니다. ..네. 그것은 고전적인 의미의 논증이 아니라(내 입장을 정당화하기 위한 것입니다), 내가 왜 그 문구를 겁에 질려 썼는지에 대한 질문에 대한 답변이었습니다.

일반적으로 개발자가 여기에 응답하지 않으면 저녁에 토론 및 중간 결과에 대한 링크가 포함된 요청을 작성합니다. 1) "버그는 버그가 아닙니다" 및 2) 문서의 변경이라는 두 가지 응용 프로그램이 필요합니다. 주제를 너무 깊이 파고 들었으므로 두 번째 지원서를 직접 작성하시겠습니까?

1. 정말 깊은가요? 개발자가 무엇을 말하고 어디에서 말하고 싶은지 이해한다면 침을 뱉어 드리겠습니다.

그리고 때로는 다음과 같이 나타납니다. I/O 버퍼에 대한 언급이 있지만 이에 대한 일반적인 설명은 없습니다. 아니면 여기 있는 모든 사람들이 FILE I/O BUFFER가 무엇인지 알고 있습니까?

파일 작업에 대한 장에 이 문제에 대한 일반적인 설명을 추가하는 것이 정말 어려운가요? 아니면 이제 개발자가 무엇을 어떻게 의도했는지에 대한 답을 찾기 위해 Google을 검색할 필요가 없습니까?

참고문헌의 크기가 한정되어 있는 것은 알지만, 왜 MQL을 막 배우기 시작한 사람들을 조롱하는가?

2. 왜 이 함수에 대한 도움말에서만 이 버퍼에 대한 언급을 최소한 찾았습니까? 파일 작업에 대한 섹션의 다른 곳에서는 이것이 언급되지 않은 이유는 무엇입니까?

3. 이와 같은 I/O 버퍼에 대한 아이디어가 있다고 가정합니다.

파일 시스템과 관련된 것은 I/O 버퍼 의 개념입니다. 데이터 입출력은 이 버퍼를 통해 이루어진다.

버퍼는 각 파일에 할당되는 메모리 영역입니다 .

파일에 쓸 때 모든 정보는 먼저 버퍼로 보내지고 전체 버퍼가 채워질 때까지 거기에 누적됩니다. 이 후 또는 특수 재설정 명령 (예: FileClose 또는 FileFlush) 후에만 버퍼에서 파일로 데이터가 전송됩니다.

파일에서 읽을 때 데이터는 먼저 버퍼로 읽혀지고 데이터는 요청된 만큼이 아니라 버퍼에 맞는 만큼 읽힙니다.

그리고 개발자들은 이것이 MQL을 배우기 시작한 초보자가 관심을 가질 수 있는 모든 정보라고 진지하게 생각합니다(물론 그러한 정의가 주어진 언어에 대해 공정한 것으로 간주될 수 있는 경우 제외)?

예를 들어, "이 버퍼 자체의 크기는 무엇이며 어떻게 결정됩니까?"라는 질문에 대한 답을 얻는 것이 흥미로워졌습니다.

제 생각에는 이 정보뿐만 아니라 이 모든 정보가 언어 문서에 있어야 합니다(정확히 거기에 있어야 하며 포럼의 다양한 기사와 토론에는 없음).

 
Interesting :
좋아, 내가 직접 써볼게
 

스크립트가 파일의 실제 " 마지막 읽기 날짜 "를 반환하지 않는 이유는 무엇입니까?

 int handle_file;
void OnStart ()
  {
   handle_file= FileOpen ( "Ye_file2.bin" , FILE_READ | FILE_WRITE | FILE_BIN );
    switch (handle_file)
     {
       case    INVALID_HANDLE : break ;
       default :
         Print ( "Дата создания файла Ye_file2.bin: " ,( datetime ) FileGetInteger (handle_file, FILE_CREATE_DATE ));
         for ( int i= 0 ;i< 3 ;i++)
           {
             Sleep ( 3000 );
             FileReadInteger (handle_file,CHAR_VALUE);
             Print ( "Дата последнего чтения Ye_file2.bin: " ,( datetime ) FileGetInteger (handle_file, FILE_ACCESS_DATE ));
           }
         FileClose (handle_file);
     }
  }
 
Yedelkin :

스크립트가 파일의 실제 " 마지막 읽기 날짜 "를 반환하지 않는 이유는 무엇입니까?

마지막 액세스 및 읽지 않음. 핸들을 다시 열면 더 행복해질 것입니다.
 
TheXpert :
마지막 액세스 및 읽지 않음.

알겠습니다. 제 질문에서 문서의 문구를 그대로 재현했습니다.

ENUM_FILE_PROPERTY_INTEGER

식별자

아이디 설명

파일이 존재

존재시험

FILE_CREATE_DATE

생성 날짜

FILE_MODIFY_DATE

마지막 수정 날짜

FILE_ACCESS_DATE

마지막으로 읽은 날짜

질문 1: 문서에 오타가 있고 "마지막 읽기 날짜" 대신 "마지막 개봉 날짜"와 같은 것이 있어야 한다고 생각하십니까? 적어도 귀하의 답변에서 "파일 읽기"및 "파일 액세스"작업이 의미가 다른 작업을 의미한다는 것이 분명합니다.

더 나아가. 이전에 첨부된 스크립트를 여러 번 다시 시작하면 다음과 같은 동작이 표시됩니다.

FK       0        FileInteger (EURGBP,M1) 21 : 33 : 56         Дата создания файла Ye_file2.bin: 2011.09 . 03 21 : 22 : 25
IP       0        FileInteger (EURGBP,M1) 21 : 33 : 59         Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 33 : 57
RL       0        FileInteger (EURGBP,M1) 21 : 34 : 02         Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 33 : 57
NH       0        FileInteger (EURGBP,M1) 21 : 34 : 06          Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 33 : 57
MH       0        FileInteger (EURGBP,M1) 21 : 34 : 43         Дата создания файла Ye_file2.bin: 2011.09 . 03 21 : 22 : 25
EP       0        FileInteger (EURGBP,M1) 21 : 34 : 46         Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 34 : 06
HL       0        FileInteger (EURGBP,M1) 21 : 34 : 50         Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 34 : 06
IH       0        FileInteger (EURGBP,M1) 21 : 34 : 53         Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 34 : 06

저것들. 스크립트가 처음 실행될 21:34:06 FileReadInteger() 함수에 대한 세 번째 호출이 발생하지만 다른 시간은 마지막 읽기/액세스 날짜로 지정됩니다. , 21:33:57 입니다. 그러나 스크립트를 두 번째(37초 후) 실행하면 FileReadInteger() 함수에 대한 첫 번째 호출 21:34:06 시간 을 제공한다는 것을 알 수 있습니다. 이전 스크립트 실행에서 FileReadInteger() 함수에 대한 마지막 호출 시간입니다.

또한 스크립트의 2차 실행이 21시 34분 43초경 에 발생한 것을 알 수 있는데, 이는 이른바 '손잡이의 재오픈'이 동시에 일어났다는 의미 다. 그러나 이러한 "손잡이를 다시 열면 " 21:34:06 반환됩니다. 당신이 말하는 시간이 절대 아닙니다.

질문 2: 어떻게 해석합니까?

더엑스퍼트 :
핸들을 다시 열면 더 행복해질 것입니다.

현재 상황에서 핸들을 "다시 열지" 않고 파일 속성을 얻을 때 행복이 기대됩니다.