php 입문 | 텍스트 파일 이용 | fgets를 사용하여 파일 로드


먼저 fopen을 사용한 “파일 읽기"부터 보도록 하자. 여기에서는 data.txt의 내용을 fopen 이용해서 읽어서 표시해 보려고 한다. 뭐, 해려고 하는 것은 지금까지와 변함 없지만 …

아래에 예제 코드를 보도록 하자.

<?php
    $f = @fopen("data.txt",'r') or exit("BREAK");
    $result = '';
    while(!feof($f)){
        $result .= fgets($f,10);
    }
    fclose($f);
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <p><?php echo $result; ?></p>
    </body>
</html>

fopen으로 파일을 열고, fclose으로 닫는 것은 이 전에 설명한대로 이다. fopen에서 예제로 “오류시 처리"도 하고 있다. 여기에서 “exit"라는 것이 사용되고 있는데, 이것은 “처리 종료"위한 것이다. 즉, 여기서 조작을 중단하고 인수의 텍스트인 “BREAK"를 화면에 출력하고 끝낸다.

파일의 데이터를 읽는 처리는 “fgets"라는 함수를 사용한다. 이것은

$변수 = fgets(파일 포인터);
$변수 = fgets(파일 포인터, 바이트수);

이런 식으로 호출한다. 인수에는 읽을 파일 포인터를 지정한다. 두번째 인수가 없으면 한줄만 읽어 드린다. 두번째 인수에 정수를 지정하면 해당 바이트 수 만큼 읽는다.

이 fgets는 “로드 위치"의 정보를 보존하고 있다. 어느 파일에서 100 바이트를 로드하면 그 만큼의 데이터를 읽어 들여, 그 자리에 “로드 위치"를 이동시키는 것이다. 또한 fgets를 호출하면 100 바이트씩 이동한 로드 위치에서 다시 계속 읽어들인다. 이렇게 fgets를 여러번 호출하여, 대용량 파일도 시작 부분부터 조금씩 읽어 나가는 수 있다.

또한 파일을 로드 할 시에 “어디서 파일이 마지막이 될지"도 체크하지 않으면 안된다. 이것은 “feof"라는 함수를 사용한다. 인수에 파일 포인터를 설정해서 호출하면 파일의 로드 위치가 파일의 끝까지 닿아 있으면 true, 아직 남아 있다면 false를 반환한다. 예제 코드를 보면,

while(!feof($f)){......

이런 식으로 반복을 하고 있다. 변수 이름 앞에 있는 “!“는 “부정"의 기호이다. 부울값(true / false)이 true이면 false, false이면 true와 같이 반대 값을 반환 연산자이다. 이것으로 feof($f)이 false인 동안 (즉, 아직 남아있다)에 반복을 계속하도록 하는 것이다.