การประมวลผลไฟล์
| English | ไทย |
|---|---|
| overwrite/ˌəʊvəˈraɪt/ | การทับซ้อน |
| APPEND/əˈpend/ | APPEND |
| temporary file/ˈtemprəri faɪl/ | ไฟล์ชั่วคราว |
คุณไม่สามารถแก้ไขบรรทัดเดียวของไฟล์ข้อความได้
- โปรแกรมต้องแก้ไขคำผิดตรงกลางไฟล์ลูกค้า ดูเหมือนจะชัดเจน: หาบรรทัด, แก้ไข, บันทึก
- ไม่มีภาษาใดแทบจะอนุญาตให้คุณทำแบบนี้ได้ ไฟล์ข้อความคือกระแสของตัวอักษร และชื่อที่แก้ไขแล้วมีความยาวต่างจากชื่อเดิม ดังนั้นทุกไบต์หลังจากนั้นจะต้องถูกย้ายไปทั้งหมด
- ดังนั้นคำตอบมาตรฐานจึงคือการไม่แก้ไขโดยตรง: คัดลอกไฟล์ทั้งหมด เปลี่ยนบรรทัดเดียวขณะคัดลอกผ่าน แล้ววางสำเนาแทนไฟล์ต้นฉบับ
- บทเรียนนี้เกี่ยวกับ การดำเนินการกับไฟล์ รูปแบบการคัดลอกเพื่ออัปเดต และการหลุมพรางที่ทำให้เกิดบั๊กจริง
การดำเนินการ
OPENFILE name FOR READ | WRITE | APPENDเปิดไฟล์ READ เปิดไฟล์ที่มีอยู่ตั้งแต่ต้น; WRITE สร้างใหม่ หรือ ทับ ไฟล์ที่มีอยู่; APPEND เปิดและเพิ่มที่ท้ายREADFILE name, variableอ่านบรรทัดถัดไปWRITEFILE name, valueเขียนหนึ่งบรรทัดCLOSEFILE nameปิดมันEOF(name)เป็น TRUE เมื่อถึงท้ายไฟล์แล้ว- Choose the file layout and access method first: serial, sequential and random files serve different operations. The copy-through examples here use sequential access to text records.
- รูปแบบสำหรับการอ่านไฟล์ทั้งฉบับมีรูปแบบเดียวกันเสมอ:
OPENFILE "names.txt" FOR READ
WHILE NOT EOF("names.txt") DO
READFILE "names.txt", thisName
OUTPUT thisName
ENDWHILE
CLOSEFILE "names.txt"

เปิด ใช้ ปิด ทุกครั้ง
ช่องทางเข้าถึงไฟล์ (File access route)
ติดตามไฟล์จากหน่วยจัดเก็บเข้าสู่โปรแกรมและกลับคืนมาอย่างปลอดภัย
การเปิดไฟล์ FOR WRITE จะเกิดขึ้นอะไรกับเนื้อหาเดิม?
WRITE สร้างหรือทับซ้อนไฟล์ เพื่อคงเนื้อหาเดิมและเพิ่มมากขึ้น ให้ใช้ APPEND
จับคู่การดำเนินการไฟล์แต่ละอันกับสิ่งที่มันทำ
WRITE ทับซ้อน, APPEND เพิ่ม; EOF ทำเครื่องหมายที่ปลาย; ลูปค้นหาจะหยุดก่อนเมื่อพบค่า
การค้นหาในไฟล์
- เพื่อค้นหา ให้อ่านทีละบรรทัดและหยุดเมื่อพบเป้าหมาย จำเป็นต้องมีสองเงื่อนไข:
WHILE NOT EOF(…) AND NOT found - โฟลเดอร์
foundมีความสำคัญ หากไม่มีลูปนี้จะอ่านทั้งไฟล์แม้后会พบคู่กัน ซึ่งเป็นการสิ้นเปลือง และไม่มีอะไรให้ทดสอบ afterwards เพื่อรายงาน "ไม่พบ"
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"
ในการค้นหาไฟล์เพื่อหาค่า เงื่อนไขลูปมักจะประกอบด้วย:
การหยุดเมื่อพบช่วยให้ไม่ต้องอ่านส่วนที่เหลือของไฟล์โดยไร้ประโยชน์
ทำไมลูปค้นหาไฟล์จึงใช้ WHILE NOT EOF AND NOT found? เลือก ทุก ข้อที่ถูกต้อง
ไฟล์ทุกฉบับยังต้องปิดอยู่ สองเงื่อนไขนี้จัดการการออกก่อนกำหนดและปลายไฟล์ตามลำดับ
การอัปเดต: รูปแบบไฟล์ชั่วคราว
- เนื่องจากไฟล์ข้อความไม่สามารถแก้ไขในตำแหน่งได้ การอัปเดตจึงต้องใช้ ไฟล์ชั่วคราว
- เปิดไฟล์ต้นฉบับ FOR READ และไฟล์ชั่วคราว FOR WRITE อ่านแต่ละบรรทัดตามลำดับ เขียนไปยังไฟล์ชั่วคราวโดย แก้ไข หรือ ไม่เปลี่ยน
- ปิดทั้งสองไฟล์ แล้ว แทนที่ ไฟล์ต้นฉบับด้วยไฟล์ชั่วคราว
- รูปแบบเดียวกันนี้ทำได้ทุกอย่าง: เพื่อ ลบ เรคอร์ด ให้ข้ามการเขียนบรรทัดนั้น; เพื่อ เพิ่ม ให้เขียนบรรทัดใหม่ ณ จุดที่เหมาะสมขณะคัดลอก
เพื่ออัปเดตไฟล์ข้อความเมื่อไม่สามารถแก้ไขในสถานที่ได้ คุณ:
คัดลอกบรรทัดแต่ละบรรทัด (เปลี่ยนหรือไม่เปลี่ยน) ไปยังไฟล์ชั่วคราว แล้วสลับเข้ามาแทนที่ไฟล์เดิม
เรียงลำดับขั้นตอนการลบเรคคอร์ดหนึ่งออกจากไฟล์ข้อความ
ขั้นตอนสุดท้ายคือสิ่งที่ผู้เข้าสอบมักลืม และหากขาดไปก็เหมือนไม่ได้ทำอะไรเลย รูปแบบเดียวกันนี้ใช้สำหรับแทรกหรือแก้ไขเรคคอร์ด
ตัวอย่างวิธีทำ: ลบเรคอร์ด
- อธิบายว่าโปรแกรมลบเรคอร์ดหนึ่งออกจากไฟล์ข้อความได้อย่างไร [4]
- เปิดไฟล์ต้นฉบับสำหรับอ่านและไฟล์ชั่วคราวสำหรับเขียน
- อ่านแต่ละบรรทัดตามลำดับ หากบรรทัดนั้น ไม่ใช่ บรรทัดที่ต้องการให้ลบ ให้เขียนลงไฟล์ชั่วคราว; หาก ใช่ ให้ไม่ต้องเขียน
- เมื่อถึงท้ายไฟล์ต้นฉบับ ให้ปิดทั้งสองไฟล์
- แทนที่ไฟล์ต้นฉบับด้วยไฟล์ชั่วคราว ทั้งสี่ขั้นตอนคะแนนเต็ม และขั้นตอนสุดท้ายคือสิ่งที่ผู้เข้าสอบมักลืม
โปรแกรมเขียน 500 เรคคอร์ดแล้วจบโดยไม่ปิดไฟล์ และ的几个บรรทัดสุดท้ายหายไป ทำไมถึงเป็นเช่นนั้น?
การเขียนถูกบัฟเฟอร์เพื่อความเร็ว การปิดไฟล์จะทำให้ buffer ถูก flush และอาจปลดล็อกที่โปรแกรมอื่นกำลังรอ
หลุมพราง
- ลืมปิด ไฟล์: ข้อมูลในบัฟเฟอร์อาจไม่ถูกเขียนเลย ทำให้เรคอร์ดสุดท้ายหายไป และไฟล์อาจถูกล็อกไม่ให้โปรแกรมอื่นเข้าถึง
- เปิด FOR WRITE ในขณะที่ตั้งใจใช้ APPEND: เนื้อหาทั้งหมดที่มีอยู่จะถูกทำลายทันทีที่ไฟล์ถูกเปิด ก่อนที่จะมีการเขียนบรรทัดใดเลย
- อ่านเกิน EOF: ตรวจสอบ
EOFก่อน每一次อ่าน ไม่ใช่หลัง - พารามิเตอร์ที่พิมพ์ตายตัว: ตั้งค่าชื่อไฟล์ไว้ในค่าคงที่เพื่อให้ปรากฏเพียงครั้งเดียวและโปรแกรมสามารถย้ายไปไว้ที่อื่นได้
การลืมปิดไฟล์อาจทำให้การเขียนที่บัฟเฟอร์ไว้หายและกีดขวางโปรแกรมอื่น — ดังนั้นคุณควรปิดไฟล์เสมอเมื่อใช้งานเสร็จ
การปิด会将 buffered data ไปยังดิสก์และปลดล็อก — FINALLY block เป็นสถานที่ที่ดีในการรับประกันสิ่งนี้
เพื่อเพิ่มรายการวันนี้ลงในบันทึกที่ต้องรักษาประวัติ เปิดไฟล์ FOR ____
WRITE จะทำลายรายการทั้งหมดที่มีอยู่ทันทีที่ไฟล์ถูกเปิด ก่อนที่บรรทัดแรกจะถูกเขียน
ตัวอย่างวิธีทำ: เลือกโหมดไหน
- โปรแกรมเพิ่มรายการธุรกรรมวันนี้ลงในบันทึกต่อเนื่องที่ต้องเก็บประวัติไว้ APPEND: WRITE จะทำลายทุกรายการที่ผ่านมา
- โปรแกรมสร้างรายงานใหม่ทุกวันกลางคืน โดยแทนที่ของเมื่อวาน WRITE: การสร้างหรือการทับก็ตรงตามความต้องการพอดี
- โปรแกรมอ่านไฟล์ตั้งค่าตอนเริ่มต้น READ
- เลือกโหมดตามสิ่งที่ต้องเกิดขึ้นกับ เนื้อหาที่มีอยู่: เก็บและเพิ่ม, ทำลาย, หรือปล่อยไว้
คะแนนที่หลุดหายไป
- รูปแบบการอัปเดตจบลงด้วยการ แทนที่ไฟล์ต้นฉบับด้วยไฟล์ชั่วคราว การคัดลอกโดยไม่有这个ขั้นตอนสุดท้ายจะไม่เปลี่ยนแปลงอะไรเลย
- ลูปการค้นหาต้องการ ทั้งสอง เงื่อนไข,
NOT EOFและNOT found, และมีสิ่งที่ทดสอบ afterwards - WRITE ทับ; APPEND เพิ่ม เลือกผิดจะทำลายไฟล์ทันทีที่เปิด
- เสมอ
CLOSEFILEบอกเหตุผล: ข้อมูลในบัฟเฟอร์อาจสูญเสียหากไม่ทำอย่างนั้น
คุณเข้าใจแล้ว
OPENFILE … FOR READ | WRITE | APPEND, แล้วREADFILEหรือWRITEFILE, แล้วCLOSEFILE;EOFถูกทดสอบ ก่อน每一次อ่าน- WRITE สร้างหรือ ทับ, APPEND เก็บเนื้อหาและเพิ่มที่ท้าย, READ เริ่มจากต้น
- ค้นหาด้วย
WHILE NOT EOF AND NOT found, เพื่อให้ลูปหยุดเร็วขึ้นและรายงาน "ไม่พบ" ได้ - อัปเดตโดยการคัดลอกผ่าน ไฟล์ชั่วคราว, เขียนแต่ละบรรทัดที่แก้ไขหรือไม่แก้ไข, ข้ามบรรทัดเพื่อลบหรือเพิ่มหนึ่งบรรทัดเพื่อใส่, แล้ว แทนที่ไฟล์ต้นฉบับ