파일열기
저장될 변수 = fopen ("파일명", "모드");

fopen함수는 파일명을 정해진 모드로 열어서 저장될 변수에 저장하는데
이때 저장되는 것을 파일 포인터라고 부른다.

파일포인터란,
파일을 읽거나 쓰기 위한 현재의 위치를 말하는 것으로
디렉토리의 핸들과 같은 개념

모드는
파일을 여는 목적을 알려주는 것으로
 모드 사용목적  포인터위치 
 r 읽기전용   파일의 시작 위치
 r+ 읽기,쓰기  파일의 시작 위치 
 w 쓰기전용,
파일이 없으면 새로생성,
기존의 내용 삭제 
  파일의 시작 위치
 w+  읽기,쓰기,
파일이 없으면 새로 생성,
기존의 내용 삭제
  파일의 시작 위치
 a  쓰기전용
파일이 없으면 새로 생성
  파일의 마지막 위치
 a+  읽기, 쓰기,
파일이 없으면 새로 생성
  파일의 마지막 위치


(여기서 $fp는 파일 포인터가 저장되는 변수)
$fp = fopen ("test.txt", "w"); //현재 서버의 test.txt를 쓰기전용으로 열기
$fp = fopen ("http://daum.net" ,  "r"); //daum.net 의 index를 읽기전용으로 열기
$fp = fopen (ftp://id@pass:daum.net , "r" ); //ftp://daum.net을 읽기전용으로 열기


fopen은 파일의 포인터만 저장한 것이지
내용을 가져오지는 않는다
디렉토리에서의 readdir함수와 마찬가지로 파일의 내용을 읽어오는 함수가 바로
fgets함수이다
저장될 변수 = fgets( "파일포인터", 길이);
파일포인터가 위치한 부분부터 정해준 길이만큼 읽어 저장될 변수에
읽어온 내용을 저장하는데,
이 함수는 기본적으로 1바이트를 소요하므로, 1바이트를 읽기 위해서는
길이를 2로 지정해주어야 한다

<?
$fp = fopen ("test.txt", "r");
echo fgets ($fp, 2);
?>
결과는 A
->영문1자는 1바이트이지만
fgets함수가 기본적으로 1바이트를 사용하므로,
즉 1바이트인 영문1자를 읽어와 출력
-> 그 후 파일포인터는 그 다음문자인 B로 넘어간다

<?
$fp = fopen ("test.txt", "r");
echo fgets ($fp, 2);
echo fgets ($fp, 2);
?>
결과는
AB

while을 사용하여 test.txt의 내용을 모두 읽어오려면
<?
$fp = fopen ("test.txt", "r");
while ($file = fgets($fp,2)) {
 echo $file;
}
?>
결과는
ABC DEF GHI

echo문의 특성상 위와 같이 반복적으로 한 글자씩 출력하는 방법은 좋지않다.
내용이 많은 파일인 경우 위의소스는 많은 시간을 소요하게 될 것이다

따라서 while문 안에서 읽어오는 내용을 하나의 변수에 차곡차곡 넣어주고
while문이끝나면 한꺼번에 출력해주는 방법을 사용하는 것이 좋다
<?
$fp = fopen ("test.txt", "r");
while ($file = fgets($fp,2)) {
 $result .= $file;
}
echo $result;
?>
-> $a .= $b는 $a = $a . $b 와 같기에

원래 test.txt파일의 모양처럼
ABC
DEF
GHI
의 모양으로 출력하고 싶다면
nl2br함수를 사용하여
\n<br>로 만들어 주어야 한다

<?
$fp = fopen ("test.txt", "r");
while ($file = fgets($fp,2)) {
 $result .= $file;
}
echo nl2br($result);
?>
결과는
ABC
DEF
GHI



마지막으로
fclose함수를 사용하여 파일포인터를 닫아 주어야 한다
fclose ("파일포인터");
-파일포인터닫기

파일포인터가 파일의 끝까지 모두 이동하였는지 알아보는방법
feof ("파일포인터");
-파일포인터가 파일의 끝에 위치하는지를 알려주는 함수로
파일의 긑에 있으면 true, 아니면 false를 리턴

<?
$fp = fopen ("test.txt", "r");
while ($file = fgets($fp,2)) {
 $result .= $file;
}
echo nl2br($result);
echo feof($fp);
fclose ($fp);
?>
결과는
ABC
DEF
GHI1
->여기서 1은 모든 내용을 읽어 왔다는 것을 나타낸다


참고!
물론 fgets함수에서 길이를 2바이트로 한다는 것을
while문이 반복되는 횟수를 늘리게 되어 서버에 부하를 주고,
읽어오는 속도가 느려지게 되므로

길이를 1024나 2048, 4096과 같이 적당하게 주어서
빠르고 서버에 부담이 없게 파일의 내용을 읽어오도록 지정해 주는 것이 좋다.



+ Recent posts