การอ่านไฟล์และ stdin
ส่งอินพุตแบบสตรีมเข้าสู่โปรแกรม
การอ่านไฟล์และ stdin เป็นบทเรียน Zig Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Zig Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
เครื่องมือรับข้อมูลป้อนเข้า
โดยทั่วไป CLI ที่มีประโยชน์มักอ่านบางสิ่ง เช่น ไฟล์ที่คุณระบุชื่อ หรือข้อความที่ส่งผ่านเข้ามา Zig มอบวิธีที่ชัดเจนและระบุได้อย่างตรงไปตรงมาเพื่อทำทั้งสองอย่าง 📥
เปิดไฟล์ด้วยพาธ
ใช้ std.fs.cwd เพื่อรับไดเรกทอรีปัจจุบัน จากนั้นใช้ openFile เพื่อเปิดพาธที่สัมพันธ์กับไดเรกทอรีนั้นสำหรับการอ่าน
const file = try std.fs.cwd().openFile(path, .{});ปิดสิ่งที่คุณเปิดเสมอ
ไฟล์ที่เปิดอยู่คือทรัพยากรที่คุณเป็นเจ้าของ จับคู่การเปิดไฟล์กับ defer file.close() เพื่อให้ไฟล์ถูกคืนทรัพยากรไม่ว่าฟังก์ชันจะจบการทำงานอย่างไร
defer file.close();อ่านทั้งไฟล์
หากต้องการอ่านทุกอย่างเข้ามาพร้อมกัน ให้เรียก readToEndAlloc พร้อมตัวจัดสรรและขีดจำกัดขนาด ฟังก์ชันนี้คืนไบต์เป็นสไลซ์ที่คุณเป็นเจ้าของ
const data = try file.readToEndAlloc(a, 1024 * 1024);คืนไบต์ภายหลัง
สไลซ์ที่คืนมานั้นอยู่บนฮีป ดังนั้นคุณจึงเป็นเจ้าของ เพิ่ม defer a.free(data) เพื่อคืนบัฟเฟอร์เมื่อใช้งานเสร็จ
defer a.free(data);ขีดจำกัดขนาดคือกลไกป้องกัน
อาร์กิวเมนต์จำนวนไบต์สูงสุดช่วยป้องกันไม่ให้ไฟล์ขนาดใหญ่ใช้หน่วยความจำจนหมด เลือกขีดจำกัดที่เหมาะกับข้อมูลป้อนเข้าตามการใช้งานจริงของเครื่องมือ
รับข้อมูลป้อนเข้ามาตรฐาน
หากต้องการอ่านข้อความที่ส่งผ่านเข้ามา ให้ใช้ std.io.getStdIn ฟังก์ชันนี้คืนไฟล์ในลักษณะเดียวกับไฟล์ที่คุณเปิดเอง ดังนั้นจึงใช้การเรียกอ่านแบบเดียวกันได้
const stdin = std.io.getStdIn();อ่าน stdin ทั้งหมด
ขอ reader จาก stdin แล้วเรียก readAllAlloc ฟังก์ชันนี้จะรวบรวมทุกสิ่งที่ส่งผ่านเข้ามาจนถึงจุดสิ้นสุดของข้อมูลป้อนเข้าไว้ในสไลซ์เดียวที่คุณเป็นเจ้าของ
const input = try stdin.reader().readAllAlloc(a, 1024 * 1024);อ่านทีละบรรทัด
สำหรับการทำงานแบบสตรีม readUntilDelimiterOrEof ของ reader จะดึงข้อมูลทีละบรรทัดลงในบัฟเฟอร์ และคืนค่า null เมื่อข้อมูลป้อนเข้าสิ้นสุด
const line = try r.readUntilDelimiterOrEof(&buf, '\n');ใช้บัฟเฟอร์เพื่อความเร็ว
การอ่านดิบแต่ละครั้งอาจเป็นการเรียกใช้ระบบ ห่อ reader ด้วย std.io.bufferedReader เพื่อรวมการอ่านขนาดเล็กจำนวนมากให้เป็นการดำเนินการที่น้อยลงและเร็วขึ้น
var br = std.io.bufferedReader(file.reader());ไฟล์หรือไพป์ ใช้โค้ดเดียวกัน
เนื่องจากทั้งไฟล์และ stdin ต่างเปิดให้ใช้ reader ตรรกะการแยกวิเคราะห์ของคุณจึงไม่จำเป็นต้องสนใจว่าได้รับสิ่งใดมา นี่คือการออกแบบที่สะอาดและนำกลับมาใช้ใหม่ได้ ✨
ตรวจสอบอย่างรวดเร็ว
ลองนึกย้อนดูว่าคุณเปลี่ยนไบต์ของไฟล์ให้เป็นสิ่งที่นำไปใช้ได้อย่างไร
สรุป
คุณเปิดไฟล์ด้วย openFile อ่านไฟล์ทั้งหมดหรืออ่านทีละบรรทัด ดึงข้อความจาก stdin และคืนหน่วยความจำของทุกบัฟเฟอร์ จัดการข้อมูลป้อนเข้าเรียบร้อย 🎯
คำถามที่พบบ่อย
บทเรียน “การอ่านไฟล์และ stdin” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การอ่านไฟล์และ stdin” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Zig Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การอ่านไฟล์และ stdin”
ส่งอินพุตแบบสตรีมเข้าสู่โปรแกรม คุณปฏิบัติ Zig Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Zig Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Zig Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การอ่านไฟล์และ stdin” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Zig Academy นี้ได้ไหม
ได้ บทเรียน Zig Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การอ่านอาร์กิวเมนต์จากบรรทัดคำสั่ง
- การอ่านไฟล์และ stdin
- การเขียนเอาต์พุตและรหัสจบการทำงาน
- จัดแพ็กเกจและเผยแพร่ไบนารี