Mỗi lần bạn gọi thủ tục đọc dữ liệu, nó sẽ đọc dòng hiện tại, tức là nếu mở lần đầu tiên thì nó sẽ đọc nguyên dòng đầu tiên nếu dòng này chứa ký tự, còn nếu dòng này chỉ chứa các ký số thì nó sẽ đọc 1 ký số (mỗi ký số cách nhau bằng khoảng trống). Nếu dùng read thì sau khi đọc xong 1 ký số hay là một chuỗi ký tự thì con trỏ vẫn đặt ở dòng đó, cho nên nếu bạn gọi thủ tục read lần thứ hai, nó sẽ không đọc được dữ liệu hoặc là nếu còn dữ liệu trên dòng này thì nó sẽ đọc các dữ liệu đó. Vì vậy nếu bạn muốn đọc dữ liệu ở các dòng tiếp theo, bạn cần dùng thủ tục readln để sau khi đọc xong một dòng thì con trỏ sẽ chuyển xuống dòng dưới và khi đó nếu gọi thủ tục một lần nữa thì bạn có thể đọc được dữ liệu mới ở các dòng tiếp theo.
Ví dụ: Một tệp có nội dung như sau:
dong 1
dong 2
dong 3
dong 4
Dùng Pascal đọc dữ liệu:
read(f, st); // đây là lần đầu gọi nên st sẽ bằng 'dong 1'
read(f, st); // hông có dữ liệu vì con trỏ vẫn ở dòng đầu
Vì vậy cần sửa lại:
readln(f, st); // st = 'dong 1', sau đó con trỏ xuống dòng
readln(f, st); // sr = 'dong 2', sau đó con trỏ xuống dòng
readln(f, st); //st = 'dong 3', sau đó con trỏ xuống dòng
readln(f, st); //st = 'dong 4', sau đó con trỏ xuống dòng
Với cách dùng liên tiếp các thủ tục readln như thế sẽ giúp đọc hết dữ liệu tệp nhưng nếu số dòng tăng lên lớn thì ghi theo kiểu 'liệt kê' như vậy không khả thi, để giải quyết ta dùng vòng lặp While, lặp cho đến khi hết tệp, tức là hàm eof trả về true.
Mã lệnh:
While not(eof(f)) do
begin
readln(f, st);
// ghi các câu lệnh lưu trữ hay xử lý dữ liệu vừa lấy được
end;
Hàm eof(f) sẽ trả về true nếu con trỏ ở cuối tệp vì vậy đoạn lệnh trên có thể hiều là lặp cho đến khi con trỏ về cuối tệp.
Ví dụ: Đọc dữ liệu từ một tệp chứa các số, mỗi số cách nhau 1 khoảng trắng. Tệp nội dung như sau:
7 11 13 41 5 1
2 32 1 21 51 6 10
2 51 5
14 5 61 90 100
Mã lệnh:
WHILE not(EOF(f)) DO
begin
if not(EOLN(f)) then
read(f, x)
else
readln(f); // xuống dòng
end;
Với cấu trúc trên bạn có thể đọc được hết dữ liệu từ tệp.
* EOLN(f) trả về true nếu con trỏ ở cuối dòng.