ไฟล์
แนะนำใหม่| English | ความหมาย |
|---|---|
| file/faɪl/ | ไฟล์ |
| text file/tekst faɪl/ | ไฟล์ข้อความ |
| secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ | หน่วยความจำสำรอง |
| persistence/pəˈsɪstəns/ | ความถาวร |
| end of file/end ɒv faɪl/ | สิ้นสุดไฟล์ |
| separator/ˈsepəreɪtə/ | ตัวคั่น |
| sequential/siːˈkwenʃl/ | ตามลำดับ |
เกมที่จดจำได้
- จนถึงปี ค.ศ. 1987 การปิดเครื่องเกมจะลบทุกอย่างทิ้ง ทุกเซสชันจะเริ่มจากหน้าจอแรก เกมที่ยาวนานคือบ่ายที่ยาวนานหรือไม่เลยก็ได้
- The Legend of Zelda มาพร้อมกับแบตเตอรี่ขนาดเล็กภายใน cartridge ที่รักษาข้อมูลหลายร้อยไบต์ไว้ให้ทำงานต่อ ครั้งแรกเกมสำหรับบ้านสามารถ บันทึก และกลับมาเล่นต่อจากจุดที่เคยวางไว้ได้
- คะแนนสูงสุดทุกคะแนน เอกสารทุกฉบับ และการตั้งค่าที่คุณเคยเก็บไว้ทั้งหมดมีอยู่เพราะเหตุผลเดียวกัน: RAM ลืมเมื่อไฟดับ และ ไฟล์ ไม่ลืม
- บทเรียนนี้คือเหตุผลที่มีไฟล์以及如何 pseudocode อ่านและเขียนไฟล์ข้อความ บรรทัดต่อบรรทัด
ทำไมต้องใช้ไฟล์
- ตัวแปรอยู่ใน RAM และหายไปเมื่อโปรแกรมสิ้นสุด ไฟล์ บน พื้นที่จัดเก็บรอง รักษาข้อมูลไว้ระหว่างรอบการทำงานของโปรแกรม: ความถาวร (persistence)
- ไฟล์ทำให้ผลลัพธ์ของโปรแกรมหนึ่งกลายเป็นอินพุตของอีกโปรแกรมหนึ่ง ทำให้ข้อมูลสามารถ แชร์ ได้
- ไฟล์สามารถเก็บข้อมูลได้ มากกว่าที่ memori จะใส่ได้, และโปรแกรมสามารถ เริ่มต้นใหม่ จากสถานะที่บันทึกไว้

ตัวแปรหายไปเมื่อจบรอบการทำงาน; ไฟล์ยังอยู่พรุ่งนี้
ทำไมโปรแกรมจึงเขียนข้อมูลลงในไฟล์แทนที่จะเก็บไว้ในตัวแปร?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
RAM มีสภาพผันผวน (volatile) ดังนั้นข้อมูลจะหายเมื่อออกจากโปรแกรม ไฟล์บนหน่วยความจำรองจะคงอยู่ระหว่างการใช้งาน
ไฟล์ข้อความและโหมดทั้งสาม
- ไฟล์ข้อความ เก็บข้อมูลเป็นบรรทัดของตัวอักษร ซึ่งโปรแกรมอ่านและเขียนทีละบรรทัด เริ่มจากต้น ลำดับของบรรทัดเหล่านี้คือสิ่งที่ทำให้ลูปสามารถวนผ่านได้
OPENFILE … FOR READอ่านจากบรรทัดแรกFOR WRITEสร้างไฟล์ใหม่หรือ ทับ ไฟล์ที่มีอยู่เดิมFOR APPENDเพิ่มบรรทัดใหม่ที่ 尾盘 โดยเก็บสิ่งที่มีอยู่เดิมไว้- เปิดก่อนใช้ ปิดหลังใช้ ไฟล์จะมีเพียงโหมดเดียวในเวลาใดเวลาหนึ่ง
จับคู่โหมดเปิดไฟล์แต่ละชนิดกับหน้าที่ของมัน
Difficulty 2/5 · 140 coins + a small bonus on first completion today
READ อ่าน; WRITE ทับแทนตั้งแต่ต้น; APPEND เพิ่มที่ท้ายโดยไม่สูญเสียสิ่งที่มีอยู่
เพื่อเพิ่มบรรทัดที่ท้ายไฟล์ที่มีอยู่แล้วโดยไม่สูญเสียเนื้อหา ให้เปิดไฟล์ในโหมด ____
Difficulty 1/5 · 100 coins + a small bonus on first completion today
WRITE จะเริ่มไฟล์ว่างเปล่า APPEND รักษาสิ่งที่มีอยู่และเขียนต่อจากนั้น
การอ่านทุกบรรทัด
OPENFILE "data.txt" FOR READ
WHILE NOT EOF("data.txt") DO
READFILE "data.txt", LineString
OUTPUT LineString
ENDWHILE
CLOSEFILE "data.txt"
EOFทดสอบ ปลายไฟล์ ทดสอบมัน ก่อน การอ่านทุกครั้ง: การอ่านเกินปลายไฟล์ถือเป็นข้อผิดพลาดCLOSEFILEสำคัญ: ข้อมูลที่ buffering อาจสูญหายและโปรแกรมอื่นถูกกีดกันออกจากไฟล์ที่ถูกเปิดค้างไว้
การจัดการไฟล์: เปิด → ใช้ → ปิด
ผ่านวงจรชีวิตที่ไฟล์ทุกไฟล์ปฏิบัติตาม ส่วนที่ลืมง่ายสองอย่างคือการทดสอบ EOF ขณะอ่านในลูป และการปิดไฟล์เสมอที่ตอนท้าย
EOF ทดสอบอะไร?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
EOF (end of file) ถูกทดสอบก่อนแต่ละครั้งอ่านเพื่อให้ลูปหยุดเมื่อไม่มีข้อมูลเหลือ
ทำไมต้องปิดไฟล์เสมอหลังจากใช้งาน?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
การปิดส่งข้อมูลการเขียนที่รออยู่ในบัฟเฟอร์ลงดิสก์และปลดล็อกเพื่อให้โปรแกรมอื่นสามารถใช้งานไฟล์ได้
การเขียนบรรทัด
OPENFILE "log.txt" FOR WRITE
FOR i ← 1 TO 100
WRITEFILE "log.txt", "Event " & NUM_TO_STR(i)
NEXT i
CLOSEFILE "log.txt"
WRITEเริ่มไฟล์ให้ว่างเปล่า หากต้องการเพิ่มลงในบันทึกที่ต้องรักษารายละเอียดเดิม ให้เปิด它以FOR APPENDแทน- ไฟล์ข้อความเก็บ สตริง: ตัวเลขจะถูกแปลงด้วย
NUM_TO_STRในการส่งออก
ตัวอย่างวิธีทำ: สามบรรทัดสุดท้ายของไฟล์
- เขียน procedure
LastLines(FileName)เพื่อแสดงผลสามบรรทัดสุดท้ายของไฟล์ข้อความ ตามลำดับ
PROCEDURE LastLines(BYVAL FileName : STRING)
DECLARE LineX, LineY, LineZ : STRING
LineX ← ""
LineY ← ""
LineZ ← ""
OPENFILE FileName FOR READ
WHILE NOT EOF(FileName) DO
LineX ← LineY
LineY ← LineZ
READFILE FileName, LineZ
ENDWHILE
CLOSEFILE FileName
OUTPUT LineX
OUTPUT LineY
OUTPUT LineZ
ENDPROCEDURE
- แต่ละบรรทัดใหม่จะดันบรรทัดเก่าออกไป ทำให้ที่
EOFตัวแปรทั้งสามจะเก็บสามบรรทัดสุดท้าย; ไฟล์สั้นกว่าจะแสดงผลเป็นสตริงว่าง สำหรับ ห้า บรรทัดแรก นับจำนวนการอ่านและหยุดที่ห้า หรือ ที่EOFอย่างใดอย่างหนึ่งที่เกิดขึ้นก่อน ไฟล์ว่างจะทำให้EOFเป็นจริงทันทีหลังการเปิด
เรียงลำดับขั้นตอนของ LastLines procedure
Difficulty 3/5 · 200 coins + a small bonus on first completion today
เริ่มต้น, เปิด, ลูปด้วยการย้ายก่อนการอ่าน, ปิด, แสดงผล การย้ายหลังการอ่านจะทำให้สูญเสียบรรทัดล่าสุด
ฟیلด์ในบรรทัด
- เรคอร์ดถูกเขียนเป็น หนึ่งบรรทัด โดยมีฟیلด์ต่างๆ เชื่อมต่อกันด้วย ตัวคั่น และตัวเลขหรือ Boolean ถูกแปลงด้วย
NUM_TO_STR(และอ่านกลับด้วยSTR_TO_NUMหรือโดยการเปรียบเทียบกับ"TRUE") - เลือกตัวคั่นที่ ไม่สามารถปรากฏในข้อมูลได้: คomma หรือ
|สำหรับชื่อและตัวเลข; ห้ามใช้ช่องว่างเมื่อชื่ออาจมีช่องว่าง - การอ่านกลับ: อ่านบรรทัดนั้น, แยกด้วยตัวคั่น, แปลงแต่ละฟิลด์ให้เป็นประเภทของข้อมูล, แล้วจัดเก็บลงในเรคคอร์ด

เชื่อมต่อกันด้วยตัวคั่นเพื่อเขียน; แยกและแปลงประเภทเพื่ออ่าน
บรรทัดเก็บชื่อเต็มและคะแนนของผู้เล่น ตัวคั่น哪种 safest choice?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ตัวคั่นไม่ควรเกิดขึ้นภายในฟิลด์ ชื่อเต็มมีช่องว่าง และคะแนนมีเลข
INTEGER สามารถเขียนลงในไฟล์ข้อความได้โดยตรงโดยไม่ต้องแปลงเป็น string ก่อน
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ไฟล์ข้อความเก็บบรรทัดของอักขระ แปลงด้วย NUM_TO_STR เพื่อเขียนและ STR_TO_NUM เพื่ออ่านกลับ
ตัวอย่างวิธีทำ: บันทึกเรคคอร์ดแล้วโหลดกลับมา
- เรคคอร์ด
Playerมีฟิลด์Name : STRINGและScore : INTEGER. เขียน伪代码เพื่อยึดเพิ่มเข้ากับscores.txtในรูปแบบบรรทัดเดียว และอ่านกลับหนึ่งบรรทัดเข้าไปในเรคคอร์ด.
OPENFILE "scores.txt" FOR APPEND
WRITEFILE "scores.txt", Player.Name & "," & NUM_TO_STR(Player.Score)
CLOSEFILE "scores.txt"
OPENFILE "scores.txt" FOR READ
READFILE "scores.txt", Line
Pos ← POSITION(Line, ",")
Player.Name ← LEFT(Line, Pos - 1)
Player.Score ← STR_TO_NUM(MID(Line, Pos + 1, LENGTH(Line) - Pos))
CLOSEFILE "scores.txt"
- คะแนน: โหมดที่ถูกต้อง, การแปลงตัวเลขในทั้งสองทิศทาง, ตัวคั่นที่ไม่สามารถปรากฏในชื่อ, และการปิดไฟล์ทั้งสอง
เพื่อจัดเก็บเรคอร์ดเป็นบรรทัดเดียวของไฟล์ข้อความ โปรแกรมต้อง: เลือก ทั้งหมด ที่ถูกต้อง
Difficulty 2/5 · 140 coins + a small bonus on first completion today
แปลง, เชื่อม, เขียน, ปิด ไฟล์ข้อความไม่มีโครงสร้าง binary; นั่นคือสิ่งที่ไฟล์ binary จะทำ
การเข้าถึงแบบลำดับและการเข้าถึงโดยตรง
- ไฟล์ข้อความเป็นแบบ ลำดับ (เรียงลำดับ): จะอ่านตามลำดับตั้งแต่ต้น ดังนั้นการหาบรรทัดหนึ่งจึงต้องอ่านทุกบรรทัดก่อนหน้า
- การเข้าถึง โดยตรง (สุ่ม) จะกระโดดไปยังเรคคอร์ดที่ตำแหน่งที่คำนวณไว้โดยไม่ต้องอ่านอื่นๆ; จำเป็นต้องใช้เรคคอร์ดความยาวคงที่ ซึ่งไฟล์ข้อความไม่มี
- สำหรับหลักสูตร การวนลูปไฟล์ข้อความข้างต้นคือโมเดล: เปิด, ทดสอบ
EOF, อ่าน, ปิด
การเข้าถึงโดยตรง (random access) ช่วยให้โปรแกรมกระโดดตรงไปยังเรคอร์ดโดยไม่ต้องอ่านอันอื่นก่อน
Difficulty 1/5 · 100 coins + a small bonus on first completion today
การเข้าถึงแบบ serial ต้องอ่านจากต้น
คะแนนที่หลุดหายไป
- การอ่านเกินปลายไฟล์ ทดสอบ
EOFก่อน การกระทำREADFILEทุกครั้ง - เปิด
FOR WRITEเมื่อไฟล์ต้องรักษาเนื้อหาไว้ นั่นคือAPPEND. - การเขียนตัวเลขโดยไม่ใช้
NUM_TO_STR, หรืออ่านกลับโดยไม่ใช้STR_TO_NUMไฟล์ข้อความจัดเก็บเป็นสตริงเท่านั้น - ลืม
CLOSEFILE, หรือใช้ไฟล์ก่อนOPENFILEทั้งสองกรณีจะเสียคะแนนเรื่องการจัดการไฟล์
คุณเข้าใจแล้ว
- ไฟล์ให้ความ ถาวร: ข้อมูลยังคงอยู่หลังจบโปรแกรม สามารถแชร์ได้ และสามารถมีปริมาณมากกว่าหน่วยความจำ
OPENFILE … FOR READ | WRITE | APPEND→READFILE/WRITEFILE→CLOSEFILE;WRITEทับ,APPENDเพิ่มที่ท้าย- ทดสอบ
EOFก่อนการอ่านทุกครั้ง; แปลงตัวเลขโดยใช้NUM_TO_STRออกและSTR_TO_NUMกลับ - หนึ่งเรคคอร์ด = หนึ่งบรรทัด, ฟิลด์เชื่อมต่อกันด้วย ตัวคั่น ที่ไม่ปรากฏในข้อมูล