Trong PHP, hàm fopen() trả về con trỏ tệp của một tệp được sử dụng trong các chế độ mở khác nhau như "w" cho chế độ ghi, "r" cho chế độ đọc và "r+" cho chế độ đọc/ghi đồng thời, và chế độ "a" đại diện cho chế độ thêm.
Khi một tệp được mở với tham số chế độ "w", nó luôn mở một tệp mới. Điều này có nghĩa là nếu tệp đã tồn tại, nội dung của nó sẽ bị mất. Hàm fwrite() tiếp theo sẽ đặt dữ liệu ở vị trí bắt đầu của tệp.
Giả sử rằng một tệp "new.txt" có sẵn với nội dung sau −
Hello World TutorialsPoint PHP Tutorial
Câu tuyên bố sau đây −
$fp = fopen("new.txt", "w");
Xóa tất cả dữ liệu hiện có trước khi nội dung mới được ghi.
Rõ ràng, không thể thêm dữ liệu mới nếu tệp được mở với chế độ "r". Tuy nhiên, chế độ "r+" hoặc "w+" mở tệp trong chế độ "r/w", nhưng một câu lệnh fwrite() ngay sau khi mở tệp sẽ ghi đè lên nội dung.
Hãy xem xét đoạn mã sau −
<?php $fp = fopen("new.txt", "r+"); fwrite($fp, "PHP-MySQL Tutorial\n"); fclose($fp); ?>
Với đoạn mã này, nội dung của tệp "new.txt" bây giờ sẽ trở thành −
PHP-MySQL Tutorial lsPoint PHP Tutorial
Để đảm bảo rằng nội dung mới được thêm vào cuối tệp hiện có, chúng ta cần đặt con trỏ tệp về cuối trước khi thực hiện thao tác ghi. (Vị trí ban đầu của con trỏ tệp ở byte thứ 0)
Hàm fseek() của PHP cho phép bạn đặt con trỏ tệp ở bất kỳ vị trí nào bạn muốn −
fseek(resource $stream, int $offset, int $whence = SEEK_SET): int
Tham số $whence là từ nơi mà độ lệch được tính. Giá trị của nó là −
SEEK_SET − Đặt vị trí bằng với số byte dịch chuyển.
SEEK_CUR − Đặt vị trí đến vị trí hiện tại cộng với độ lệch.
SEEK_END − Đặt vị trí đến cuối tệp cộng với độ lệch.
Vì vậy, chúng ta cần di chuyển con trỏ đến cuối bằng cách sử dụng hàm fseek() như trong đoạn mã sau, đoạn mã này thêm nội dung mới vào cuối.
<?php $fp = fopen("new.txt", "r+"); fseek($fp, 0, SEEK_END); fwrite($fp, "\nPHP-MySQL Tutorial\n"); fclose($fp); ?>
Bây giờ hãy kiểm tra nội dung của "new.txt". Nó sẽ có đoạn văn bản sau −
Hello World TutorialsPoint PHP Tutorial PHP-MySQL Tutorial
Thay vì di chuyển con trỏ đến cuối một cách thủ công, tham số "a" trong hàm fopen() mở tệp ở chế độ thêm. Mỗi câu lệnh fwrite() sẽ thêm nội dung vào cuối các nội dung hiện có, bằng cách tự động di chuyển con trỏ đến vị trí SEEK_END.
<?php $fp = fopen("new.txt", "a"); fwrite($fp, "\nPHP-MySQL Tutorial\n"); fclose($fp); ?>
Một trong các chế độ được phép cho hàm fopen() là chế độ "r+", trong đó tệp thực hiện thao tác đọc/thêm. Để đọc dữ liệu từ bất kỳ vị trí nào, bạn có thể đặt con trỏ đến byte mong muốn bằng fseek(). Tuy nhiên, mỗi thao tác fwrite() chỉ ghi nội dung mới ở cuối tệp.
Trong chương trình dưới đây, tệp được mở ở chế độ "a+". Để đọc dòng đầu tiên, chúng ta di chuyển vị trí tệp về vị trí 0, tức là vị trí từ đầu. Tuy nhiên, câu lệnh fwrite() vẫn thêm nội dung mới vào cuối và không ghi đè lên dòng tiếp theo như nó sẽ làm nếu mở ở chế độ "r+".
<?php $fp = fopen("new.txt", "a+"); fseek($fp, 0, SEEK_SET); $data = fread($fp, 12); echo $data; fwrite($fp, "PHP-File Handling"); fclose ($fp); ?>
Vì vậy, chúng ta có thể thêm dữ liệu vào một tệp hiện có nếu nó được mở ở chế độ "r+/w+" hoặc "a/a+"