Wifstream ไบนารี ตัวเลือก


ฉันอ่านไฟล์ไบนารีเป็น: แต่ฉันตระหนักว่านี่ไม่ใช่ไบนารีจริงอ่าน ifstream จริงอ่านไบต์และแปลงเป็นถ่านกว้าง ดังนั้นหากไฟล์ไบนารีมีเนื้อหา 0x112233 ff ที่จริงผมอ่าน 0x110022003300 ff00 นี้ไม่ได้ให้ความรู้สึกมากกับฉัน: ครั้งแรกฉันจะต้องใช้คลื่นกว้างเพราะชื่อไฟล์ไม่ใช่ภาษาละติน ประการที่สองถ้าฉันพูดว่า fstream เป็นไบนารีทำไมอ่านอ่านกว้าง chars รหัสด้านล่างไม่สิ่งที่ฉันต้องการ มีวิธีการเพื่อให้บรรลุว่าใช้ std fstreams ถาม 21 มีนาคม 11 ที่ 19:15 I'm ใช้ Visual Studio for Windows และเรียบเรียง Intel สำหรับ Linux. โซลูชันของคุณใช้งานได้ดีใน Windows ฉันยังพยายามทดลองใช้งานบน Linux เป็นทางออกที่หรูหรา ฉันไม่ต้องการพึ่งพาส่วนขยายของคอมไพเลอร์แม้ว่า คุณคิดว่าคุณสามารถทำเช่นนี้ติดกับมาตรฐานอาจระบุ charset เป็นพารามิเตอร์เทมเพลต ifstream ndash rturrado 22 มีนาคมที่ 15:15 rturrado: (ลบความคิดเห็นก่อนหน้า) ฉันไม่แนะนำ Boost. Filesystem อีกต่อไปเนื่องจาก คือการกำหนดอินเทอร์เฟซที่แตกต่างกันบนแพลตฟอร์มต่างๆซึ่งโดยทั่วไปจะทำให้เกิดปัญหาเรื่องการพกพาและทำให้ยากที่จะเขียนรหัสที่ถูกต้องของ Unicode จากประสบการณ์ของผมจะเป็นการดีกว่าที่จะปฏิบัติตามแนวทางที่ผมเขียนไว้ใน EDIT ndash ybungalobill 23 ส. ค. 12 เวลา 13: 00C ไฟล์ไบนารี IO โดยปกติแล้วสำหรับไฟล์ไบนารี io คุณไม่ใช้ข้อความ ltlt และโอเปอเรเตอร์แบบข้อความทั่วไปสามารถทำได้ แต่เป็นหัวข้อขั้นสูง โมเดลพื้นฐานสำหรับไฟล์ IO ใน C คลาสสตรีมไฟล์ได้รับการออกแบบด้วยแนวคิดว่าควรดูไฟล์เพียงอย่างเดียวว่าเป็นสตรีมหรืออาร์เรย์ของไบต์ที่ไม่มีการอธิบาย เพื่อความสะดวกอาร์เรย์ไบต์ที่เก็บไว้ในไฟล์มีการจัดทำดัชนีตั้งแต่ศูนย์ถึง -1 len โดยที่ len คือจำนวนไบต์ทั้งหมดในไฟล์ทั้งหมด ไฟล์ที่เปิดแต่ละไฟล์มีสองตำแหน่งที่เชื่อมโยงอยู่: ตำแหน่งการอ่านปัจจุบันซึ่งเป็นดัชนีของไบต์ถัดไปที่จะอ่านจากไฟล์ นี้เรียกว่าได้รับตัวชี้เนื่องจากมันชี้ไปที่ตัวต่อไปที่ได้รับวิธีพื้นฐานจะกลับ ตำแหน่งการเขียนปัจจุบันซึ่งเป็นดัชนีของตำแหน่งไบต์ที่ไบต์ขาออกถัดไปจะถูกวางไว้ นี่เรียกว่า put pointer เนื่องจากมันชี้ไปยังตำแหน่งที่พื้นฐาน put method จะวาง parameter ไว้ ทั้งสองตำแหน่งไฟล์มีความเป็นอิสระและทั้งสองสามารถชี้ไปที่ใดก็ได้ในไฟล์การกำหนดขนาดของไฟล์วิธีปกติในการรับขนาดของไฟล์คือการใช้สถิติฟังก์ชันห้องสมุด C โปรดทราบว่าพารามิเตอร์ที่สองของ stat คือตัวชี้ คุณมีหน้าที่รับผิดชอบในการสร้างและจัดการหน่วยความจำที่ stat จะวางผลการค้นหาไว้และที่อยู่ของหน่วยความจำนั้นเป็นสิ่งที่คุณควรจะผ่านในพารามิเตอร์ที่สองนี้ ตัวอย่างข้างต้นแสดงการใช้ตัวแปรท้องถิ่นเพื่อเก็บผลลัพธ์ที่ส่งกลับโดย stat การเปิดไฟล์ออบเจ็กต์สตรีมไฟล์สามารถเปิดได้ด้วยวิธีใดวิธีหนึ่งจากสองวิธี ขั้นแรกคุณสามารถระบุชื่อไฟล์พร้อมกับพารามิเตอร์โหมด io ไปยังตัวสร้างเมื่อประกาศวัตถุ: หรือหลังจากที่มีการประกาศวัตถุสตรีมไฟล์แล้วคุณสามารถเรียกใช้เมธอดแบบเปิดได้: วิธีใดวิธีหนึ่งจะทำงานร่วมกับ ifstream ล้น หรือวัตถุ fstream โดยปกติเมื่อจัดการกับไฟล์ข้อความหนึ่ง ๆ ละเว้นพารามิเตอร์ที่สอง (พารามิเตอร์โหมด io) อย่างไรก็ตามเพื่อที่จะจัดการกับไฟล์ไบนารีคุณควรระบุโหมด io รวมทั้ง ios :: binary เป็นหนึ่งในแฟลกโหมด สำหรับการอ่าน readwrite ไปยังไฟล์ให้ใช้ fstream หมายเหตุ: ถ้าคุณเป็น GNU g user (เวอร์ชัน 2.7.x หรือเก่ากว่า) อย่าใช้ flag โหมด io เมื่อเปิดวัตถุ ifstream เนื่องจากข้อผิดพลาดในการติดตั้ง GNU libg ธงจะไม่ถูกตีความอย่างถูกต้อง ถ้าคุณทำงานภายใต้ Unix ละเว้นโหมด io flag ทั้งหมดถ้าคุณกำลังทำงานกับ g ภายใต้ MS-DOS จากนั้นใช้วัตถุ fstream หมายเหตุนี้ใช้กับผู้ใช้ g เท่านั้น การอ่านจากแฟ้มการอ่านจากวัตถุ fstream หรือ ifstream ใช้วิธีอ่าน วิธีนี้ใช้เวลาสองพารามิเตอร์: ฟังก์ชันสมาชิกที่อ่านได้จะแยกจำนวนไบต์ออกจากสตรีมที่กำหนดวางไว้ในหน่วยความจำที่ชี้ไปตามพารามิเตอร์แรก คุณเป็นผู้รับผิดชอบในการสร้างและจัดการหน่วยความจำที่อ่านจะนำเสนอผลการค้นหารวมทั้งเพื่อให้แน่ใจว่ามีขนาดใหญ่พอที่จะรองรับจำนวนไบต์ที่ต้องการได้ ไบต์ที่อ่านและไม่ตีความวิธีไม่ถือว่าอะไรเกี่ยวกับ endings บรรทัดและวิธีการอ่านไม่ได้วาง terminator null ที่ท้ายของไบต์ที่มีการอ่านถ้าข้อผิดพลาดเกิดขึ้นขณะอ่าน (ตัวอย่างเช่น ถ้าคุณอ่านตอนท้ายของไฟล์) สตรีมจะอยู่ในสถานะข้อผิดพลาด ถ้าเกิดขึ้นคุณสามารถใช้วิธีการ gcount เพื่อหาจำนวนอักขระที่อ่านได้จริงและใช้วิธีการล้างเพื่อรีเซ็ตสตรีมให้เป็นสถานะที่ใช้งานได้ เมื่อสตรีมเข้าสู่สถานะข้อผิดพลาดการดำเนินการอ่านทั้งหมดในอนาคตจะล้มเหลว การจัดตำแหน่งตัวชี้รับ (Pointer) การเปลี่ยนตำแหน่งของตัวชี้ (ตำแหน่งอ่านไฟล์) ของวัตถุ fstream หรือ ifstream ให้ใช้วิธี seekg รูปแบบพื้นฐานของการดำเนินการนี้ใช้พารามิเตอร์เดียว: streampos เป็นหลักจำนวนเต็มยาว unsigned ค่า seekg ย้ายตัวชี้ไปยังตำแหน่งไฟล์ absolute ที่ระบุ (โดยที่ 0 คือจุดเริ่มต้นของไฟล์) เมื่อโทร seekg ระวังชนิดของอาร์กิวเมนต์ของคุณ: ปัญหาข้างต้นคือไฟล์สามารถมีขนาดใหญ่มากดังนั้น streampos สามารถถือจำนวนมากมาก แต่ข้างต้นถ้า blknumber อยู่เหนือ 63 เนื่องจากชนิดของ blknumber และ BLKSIZE (ทั้งสอง int) บนเครื่องพีซีผลิตภัณฑ์ของพวกเขาเท่านั้นที่สามารถ 16 บิตกว้าง ในการแก้ไขปัญหานี้ให้แน่ใจว่าค่าคงที่ใช้ในการจัดวางไฟล์เป็นปริมาณที่ยาวหรือตัวแปรทั้งหมดที่ใช้ในตำแหน่งดังกล่าวเป็นปริมาณที่มากหรือทั้งสองอย่าง คุณสามารถกำหนดตำแหน่งตัวชี้ปัจจุบันได้โดยใช้ myFile. tellg () ซึ่งเป็นเมธอดที่ไม่มีพารามิเตอร์ที่ส่งกลับค่าดัชนีของพอยน์เตอร์รับบนสตรีมที่กำหนด นอกจากนี้ยังมีตัวแปร seekg ที่ช่วยให้คุณสามารถระบุตำแหน่งที่สัมพันธ์กับตำแหน่งตัวชี้ตำแหน่งปัจจุบันหรือสัมพันธ์กับจุดสิ้นสุดของไฟล์ การเขียนไปยังแฟ้มการเขียนไปยังวัตถุแบบเฟรมหรือกระแสหลักให้ใช้วิธีการเขียน วิธีนี้ใช้เวลาสองพารามิเตอร์: ฟังก์ชัน Write member เขียนจำนวนไบต์ที่ระบุในสตรีมที่ระบุโดยเริ่มจากตำแหน่งของตัววาง ถ้าตัวชี้วางอยู่ในตอนท้ายของไฟล์ไฟล์จะถูกขยายออกไป ถ้าตัวชี้ put วางอยู่ตรงกลางของไฟล์อักขระในไฟล์จะถูกแทนที่ด้วยข้อมูลใหม่ ไบต์ที่เขียนและไม่แปลความหมายไม่มีการเพิ่มการรับส่งข้อมูลรถหลังจากที่ข้อมูลและวิธีการเขียนไม่ถือว่ามี terminator ที่ท้ายไบต์ที่กำลังเขียนอยู่ หากเกิดข้อผิดพลาดขณะเขียนข้อความ (ตัวอย่างเช่นถ้าคุณใช้เนื้อที่ว่างบนดิสก์) สตรีมจะถูกวางไว้ในสถานะข้อผิดพลาด ข้อผิดพลาดดังกล่าวไม่เหมือนกับข้อผิดพลาดในการอ่านและมักไม่ได้รับการตรวจสอบ การเปลี่ยนตำแหน่งตัวชี้ใส่ (Put Pointer) เมื่อต้องการเปลี่ยนตำแหน่งของพูลนำ (ตำแหน่งอ่านไฟล์) ของวัตถุ fstream หรือ ofstream ให้ใช้วิธี seekp รูปแบบพื้นฐานของการดำเนินการนี้ใช้พารามิเตอร์เดียว: streampos เป็นหลักจำนวนเต็มยาว unsigned ค่า seekp ย้ายตัวชี้ put ไปยังตำแหน่งไฟล์ absolute ที่ระบุ (โดยที่ 0 คือจุดเริ่มต้นของไฟล์) คุณสามารถกำหนดตำแหน่งของตำแหน่งวางปัจจุบันได้โดยใช้ myFile. tellp () ซึ่งเป็นเมธอดที่ไม่มีพารามิเตอร์ที่ส่งกลับค่าดัชนีของพอยต์วางบนสตรีมที่ระบุ นอกจากนี้ยังมีตัวแปร seekp ที่ช่วยให้คุณระบุตำแหน่งที่สัมพันธ์กับตำแหน่งของตำแหน่งวางปัจจุบันหรือสัมพันธ์กับส่วนท้ายของไฟล์ การอ่านและการเขียนข้อมูลที่ซับซ้อนแม้ว่าการอ่านและการเขียนจะยอมรับตัวชี้แบบถ่าน แต่ก็ไม่มีความต้องการที่ข้อมูลที่คุณอ่านและเขียนจะถูกเก็บไว้ในอาร์เรย์ char คุณสามารถอ่านหรือเขียนวัตถุข้อมูลที่ซับซ้อนโดยใช้การชี้แบบชี้อย่างง่าย: การปิดไฟล์สำหรับไฟล์สตรีมทั้งหมดให้ใช้: std ifstream เปิดเปิดไฟล์ที่ระบุโดยชื่อไฟล์อาร์กิวเมนต์ เชื่อมโยงกับวัตถุสตรีมเพื่อให้มีการดำเนินการอินพุตเอาต์พุตในเนื้อหา โหมดอาร์กิวเมนต์ระบุโหมดการเปิด ถ้าสตรีมมีการเชื่อมโยงกับไฟล์อยู่แล้ว (กล่าวคือเปิดอยู่แล้ว) การเรียกใช้ฟังก์ชันนี้ไม่สำเร็จ การเชื่อมโยงไฟล์ของสตรีมจะถูกเก็บโดยบัฟเฟอร์สตรีมภายในของตน: ภายในฟังก์ชันเรียก rdbuf () - gtopen (ชื่อไฟล์โหมด) ฟังก์ชันจะตั้งค่า failbit ในกรณีที่เกิดความล้มเหลว Parameters filename String พร้อมชื่อไฟล์ที่จะเปิด ข้อมูลเฉพาะเกี่ยวกับรูปแบบและความถูกต้องขึ้นอยู่กับการใช้ไลบรารีและสภาพแวดล้อมที่ใช้งาน โหมดธงอธิบายโหมด io ที่ร้องขอสำหรับไฟล์ นี่คือออบเจกต์ของ openmode ประเภทสมาชิกบิตแมปที่ประกอบด้วยการรวมกันของค่าต่อสมาชิกต่อไปนี้:

Comments