Xử lý tập tin
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| overwrite/ˌəʊvəˈraɪt/ | ghi đè |
| APPEND/əˈpend/ | APPEND |
| temporary file/ˈtemprəri faɪl/ | tệp tạm thời |
Bạn không thể thay đổi một dòng của tệp văn bản
- Một chương trình phải sửa lỗi chính tả ở giữa tệp khách hàng. Điều này có vẻ rõ ràng: tìm dòng, thay đổi nó, lưu lại.
- Hầu như không ngôn ngữ nào cho phép bạn thực hiện điều đó. Một tệp văn bản là một dòng ký tự, và tên đã sửa có độ dài khác với tên cũ, nên mọi byte sau nó đều phải di chuyển.
- Vì vậy, câu trả lời tiêu chuẩn là không chỉnh sửa trực tiếp: sao chép toàn bộ tệp, thay đổi dòng đó khi đọc qua, và đặt bản sao lên vị trí của tệp gốc.
- Bài học này nói về các thao tác tệp, mẫu sao chép qua để cập nhật, và những bẫy dẫn đến lỗi thực tế.
Các thao tác
OPENFILE name FOR READ | WRITE | APPENDmở tệp. READ mở một tệp tồn tại từ đầu; WRITE tạo mới hoặc ghi đè lên một tệp đã có; APPEND mở tệp và thêm vào cuối.READFILE name, variableđọc dòng tiếp theo.WRITEFILE name, valueghi một dòng.CLOSEFILE nameđóng tệp.EOF(name)là TRUE khi đã đạt đến cuối.- Chọn bố cục tệp và phương pháp truy cập trước tiên: tệp tuần tự, liên tục và ngẫu nhiên phục vụ các thao tác khác nhau. Các ví dụ sao chép qua ở đây sử dụng truy cập liên tục cho các bản ghi văn bản.
- Mẫu để đọc toàn bộ tệp luôn giống nhau:
OPENFILE "names.txt" FOR READ
WHILE NOT EOF("names.txt") DO
READFILE "names.txt", thisName
OUTPUT thisName
ENDWHILE
CLOSEFILE "names.txt"

Mở, sử dụng, đóng, mỗi lần
Đường dẫn truy cập tập tin
Theo dõi tập tin từ bộ lưu trữ đến chương trình và trở lại an toàn.
Mở một tập tin FOR WRITE sẽ làm gì với nội dung hiện có?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
WRITE tạo hoặc ghi đè lên tập tin. Để giữ nguyên nội dung hiện có và thêm vào, hãy dùng APPEND.
Ghép nối mỗi thao tác tập tin với chức năng của nó.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
WRITE ghi đè, APPEND thêm; EOF đánh dấu cuối; vòng lặp tìm kiếm dừng sớm khi giá trị được tìm thấy.
Tìm kiếm trong tệp
- Để tìm kiếm, đọc từng dòng và dừng lại khi tìm thấy mục tiêu. Hai điều kiện cần thiết:
WHILE NOT EOF(…) AND NOT found. - Cờ
foundrất quan trọng. Nếu không có nó, vòng lặp sẽ đọc hết tệp ngay cả sau khi tìm thấy, gây lãng phí, và không còn gì để kiểm tra sau đó nhằm báo "không tìm thấy".
found ← FALSE
OPENFILE "names.txt" FOR READ
WHILE NOT EOF("names.txt") AND NOT found DO
READFILE "names.txt", thisName
IF thisName = target THEN
found ← TRUE
ENDIF
ENDWHILE
CLOSEFILE "names.txt"
Khi tìm kiếm trong tập tin để lấy một giá trị, điều kiện vòng lặp thường bao gồm:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Dừng lại khi tìm thấy tránh việc đọc phần còn lại của tập tin không cần thiết.
Tại sao vòng lặp tìm kiếm tập tin sử dụng WHILE NOT EOF AND NOT found? Chọn tất cả các đáp án áp dụng.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Mọi tập tin vẫn phải được đóng. Hai điều kiện xử lý thoát sớm và cuối tập tin tương ứng.
Cập nhật: mẫu tệp tạm thời
- Vì tệp văn bản không thể chỉnh sửa tại chỗ, việc cập nhật sử dụng tệp tạm thời.
- Mở tệp gốc FOR READ và tệp tạm thời FOR WRITE. Đọc từng dòng lần lượt; ghi vào tệp tạm thời dưới dạng đã thay đổi hoặc chưa thay đổi.
- Đóng cả hai tệp, sau đó thay thế tệp gốc bằng tệp tạm thời.
- Mẫu tương tự áp dụng cho mọi thứ: để xóa một bản ghi, bỏ qua việc ghi dòng đó; để thêm một bản ghi, ghi dòng mới ở đúng vị trí khi đang sao chép.
Để cập nhật một tập tin văn bản khi chỉnh sửa tại chỗ không khả thi, bạn:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Sao chép từng dòng (đã thay đổi hoặc chưa) vào tập tin tạm, sau đó hoán đổi nó với tập tin gốc.
Sắp xếp các bước xóa một bản ghi khỏi tập tin văn bản theo thứ tự.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
Bước cuối cùng là bước mà thí sinh hay bỏ sót, và nếu không có nó thì không có gì thay đổi. Mẫu này cũng áp dụng để chèn hoặc chỉnh sửa một bản ghi.
Ví dụ minh họa: xóa một bản ghi
- Mô tả cách một chương trình xóa một bản ghi khỏi tệp văn bản. [4]
- Mở tệp gốc để đọc và tệp tạm thời để ghi.
- Đọc từng dòng lần lượt. Nếu dòng không phải là dòng cần xóa, ghi nó vào tệp tạm thời; nếu là, thì không ghi nó.
- Khi chạm đến cuối tệp gốc, đóng cả hai tệp.
- Thay thế tệp gốc bằng tệp tạm thời. Bốn bước trên đều được điểm, và bước cuối cùng là bước mà thí sinh thường quên.
Một chương trình viết 500 bản ghi rồi kết thúc mà không đóng tập tin, và vài bản ghi cuối bị thiếu. Tại sao?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Các phép viết được đệm để tăng tốc. Đóng tập tin sẽ làm sạch bộ đệm, và nó cũng có thể giải phóng khóa mà các chương trình khác đang chờ.
Những bẫy
- Quên đóng file: dữ liệu bộ đệm có thể không bao giờ được ghi, khiến các bản ghi cuối cùng biến mất, và file có thể vẫn bị khóa đối với các chương trình khác.
- Mở FOR WRITE khi đáng lẽ phải dùng APPEND: toàn bộ nội dung hiện có sẽ bị xóa ngay khi file được mở, trước khi một dòng nào được viết.
- Đọc vượt quá EOF: kiểm tra
EOFtrước mỗi lần đọc, không phải sau. - Đường dẫn cứng-coded: đặt tên file vào một hằng số để nó xuất hiện chỉ một lần và chương trình có thể di chuyển dễ dàng.
Unquên đóng tập tin có thể khiến các phép viết được đệm bị mất và khóa các chương trình khác ra — vì vậy bạn luôn nên đóng tập tin khi hoàn tất.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Đóng tập tin làm sạch dữ liệu được đệm ra ổ cứng và giải phóng khóa — một khối FINALLY là nơi tốt để đảm bảo điều đó.
Để thêm các mục của ngày hôm nay vào nhật ký phải giữ lịch sử, hãy mở tập tin FOR ____.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
WRITE sẽ phá hủy mọi mục trước đó ngay khoảnh khắc tập tin được mở, trước khi viết bất kỳ dòng nào.
Ví dụ đã giải quyết: chế độ nào
- Một chương trình thêm các giao dịch hôm nay vào nhật ký chạy liên tục phải giữ lại lịch sử. APPEND: WRITE sẽ xóa bỏ mọi mục trước đó.
- Một chương trình tạo báo cáo mới mỗi tối, thay thế báo cáo của ngày hôm qua. WRITE: việc tạo mới hoặc ghi đè đúng là những gì cần thiết.
- Một chương trình đọc file cấu hình khi khởi động. READ.
- Chế độ được chọn dựa trên những gì phải xảy ra với nội dung hiện có: giữ nguyên và bổ sung, xóa bỏ, hoặc để mặc.
Điểm số dễ mất
- Mẫu cập nhật kết thúc bằng cách thay thế file gốc bằng file tạm. Sao chép mà không có bước cuối này thì không thay đổi gì cả.
- Vòng lặp tìm kiếm cần cả hai điều kiện,
NOT EOFvàNOT found, và một thứ gì đó để kiểm tra sau đó. - WRITE ghi đè; APPEND bổ sung. Chọn sai sẽ xóa file ngay tại thời điểm mở.
- Luôn
CLOSEFILE. Giải thích tại sao: nếu không, dữ liệu bộ đệm có thể bị mất.
Bạn đã nắm vững
OPENFILE … FOR READ | WRITE | APPEND, sau đó làREADFILEhoặcWRITEFILE, sau đó làCLOSEFILE;EOFđược kiểm tra trước mỗi lần đọc- WRITE tạo mới hoặc ghi đè, APPEND giữ nguyên nội dung và bổ sung vào cuối, READ bắt đầu từ đầu
- Tìm kiếm với
WHILE NOT EOF AND NOT found, để vòng lặp dừng sớm và có thể báo "không tìm thấy" - Cập nhật bằng cách sao chép thông qua file tạm, viết từng dòng đã thay đổi hoặc không thay đổi, bỏ qua một dòng để xóa hoặc thêm một dòng để chèn, sau đó thay thế file gốc