먼저, feof () 의 기본 사용법을 이해해 봅시다. 이 기능의 프로토 타입은 다음과 같습니다.
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(resource </span><span><span class="hljs-variable">$handle</span></span><span>);
</span></span>파일 리소스 (일반적으로 fopen () 함수에 의해 열리는 파일 핸들)을 매개 변수로 받아들이고 파일 포인터가 파일의 끝에 도달하면 true를 반환하고 그렇지 않으면 false를 반환합니다. 일반적으로 파일을 읽을 때 Fread () 및 Fgets () 와 같은 함수와 함께 파일을 읽었는지 여부를 결정합니다.
이진 파일과 텍스트 파일의 가장 큰 차이점은 스토리지 형식입니다. 이진 파일의 각 바이트는 다른 데이터 단위를 나타낼 수 있으며 특정 Newline 문자 (예 : \ n 또는 \ r \ n )에 의해 반드시 분리 될 필요는 없습니다. 따라서 잘못 읽기 및 쓰기 동작을 피하기 위해 이진 파일을 읽을 때 특별한주의를 기울여야합니다.
텍스트 파일에서 Feof ()는 일반적으로 마지막 문자를 읽은 후에는 True를 반환합니다. 파일의 Newlines는 프로그램에 의해 쉽게 인식되고 종료되기 때문입니다. 바이너리 파일 에서 파일에 " end ar
이진 파일로 작업 할 때 다음과 같은 일반적인 문제는 feof () 에서 발생할 수 있습니다.
이진 데이터를 읽을 때 feof ()를 반환 한다고해서 파일이 완전히 읽은 것을 의미하지는 않습니다. 때로는 feof ()가 true를 반환하더라도 파일이 완전히 읽지 않았다는 것을 알 수 있습니다. Feof ()는 파일 끝의 조건이 파일 포인터 위치를 기반으로한다고 결정하지만 읽은 모든 바이트가 완전히 검색되었음을 보장하지는 않습니다.
이진 파일에서 읽기 중에 특정 데이터 구조 (예 : 고정 길이 레코드)가있는 경우 파일 포인터의 위치는 읽기 중에 엄격하게 제어되어야합니다. 루프 판독 중에 종료되는지 여부를 결정하기 위해 Feof () 에 의존하는 경우 경우에 따라 데이터 구조의 절반을 읽을 수 있습니다.
예를 들어, 여러 고정 길이 레코드가 포함 된 이진 파일을 읽을 때 Feof ()는 마지막 레코드의 일부를 읽을 때 true를 반환 할 수 있지만 실제로 모든 데이터를 완전히 읽지는 않습니다.
Fread ()를 사용하여 파일을 읽을 때 특히주의하십시오. fread ()는 파일 끝에 읽을 때 읽는 실제 바이트 수를 반환합니다. Feof () 가 루프 종료의 플래그로만 사용되는 경우 데이터를 완전히 읽지 않았을 때 Feof ()가 True를 반환 할 수 있습니다. 이 시점에서 프로그램은 읽기 작업을 종료하여 일부 데이터 읽기가 누락 될 수 있습니다.
이를 피하기 위해 일반적으로 feof () 에 의존하지 않고 데이터를 읽을 때 읽는 실제 바이트 수를 판단해야합니다. 예를 들어:
<span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'binary_file.dat'</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>)) {
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>); </span><span><span class="hljs-comment">// 각각을 읽는다고 가정합니다1024바이트</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>) < </span><span><span class="hljs-number">1024</span></span><span>) {
</span><span><span class="hljs-comment">// 데이터의 마지막 부분을 처리하십시오</span></span><span>
</span><span><span class="hljs-keyword">break</span></span><span>;
}
</span><span><span class="hljs-comment">// 처리 데이터 처리</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
</span></span>이런 식으로, 각 데이터를 읽은 후, 실제 바이트 수를 확인하여 파일이 잘못 판단되지 않도록합니다.
이진 파일을 처리 할 때 Feof ()가 발생할 수있는 문제를 해결하려면 다음은 다음과 같습니다.
이진 파일을 읽을 때 Fread () 의 리턴 값 길이를 사용하여 파일을 읽었는지 확인할 수 있습니다. fread () 에 의해 반환 된 데이터 길이가 예상 바이트 수보다 작 으면 파일의 끝에 도달했음을 의미합니다. 이렇게하면 feof () 에 대한 의존성을 피할 수 있습니다.
파일 컨텐츠를 완전히 읽은지 확인 해야하는 경우 ftell () 함수를 결합하여 현재 파일 포인터의 위치를 확인할 수 있습니다. 포인터가 파일의 끝에 도달하면 파일을 읽는 것이 완료되었는지 확인할 수 있습니다.
<span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'binary_file.dat'</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>)) {
</span><span><span class="hljs-variable">$pos</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftell</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>) < </span><span><span class="hljs-number">1024</span></span><span>) {
</span><span><span class="hljs-keyword">break</span></span><span>;
}
</span><span><span class="hljs-comment">// 처리 데이터</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
</span></span>바이너리 파일에 특정 구조 (예 : 고정 길이 레코드)가있는 경우 Feof () 에 의존하지 않고 파일 형식에 따라 시간당 읽기 바이트 수를 지정하여 읽기 프로세스를 종료해야합니다. 파일 형식을 미리 이해함으로써 읽기 프로세스를보다 정확하게 제어하고 오해 또는 누락을 피할 수 있습니다.
PHP에서 이진 파일을 처리 할 때 특별한 예방 조치가 있습니다. 이진 파일은 명백한 분리기가 없기 때문에 Feof () 에 의존하여 파일이 읽힌 지 여부를 결정합니다. 파일을 완전히 읽으려면 fread () 의 리턴 값 길이, ftell () 의 파일 포인터 위치를 사용하거나 파일 구조에 따라보다 정확한 제어를 수행하는 것이 좋습니다. 이러한 방법은 FEOF () 의 불완전 성으로 인한 데이터 손실을 피하는 데 도움이 될 수 있습니다.