ไฟล์ข้อความ
ลองดูการทำงานกับไฟล์ข้อความในภาษา C โดยใช้ตัวอย่าง สร้างไฟล์ข้อความบนไดรฟ์ C ชื่อ TextFile.txt พิมพ์บรรทัดต่อไปนี้ในไฟล์นี้:
สตริง_1 123 สตริง_11, 456
สตริง_2
สตริง_3
บันทึกไฟล์.
และนี่คือโค้ดสำหรับโปรแกรม C ที่เปิดไฟล์ของเราและอ่านบรรทัดจากมัน:
/* *ผู้เขียน: @author Subbotin B.P..h> #include
หากต้องการเปิดไฟล์ข้อความในภาษา C ให้ใช้ฟังก์ชัน fopen:
ไฟล์ *pTextFile = fopen("C:\\TextFile.txt", "r");
อาร์กิวเมนต์แรกของฟังก์ชัน fopen ชี้ไปที่ไฟล์ และอาร์กิวเมนต์ที่สองบอกว่าไฟล์นั้นเปิดให้อ่านได้
เราอ่านบรรทัดโดยใช้ฟังก์ชัน fgets:
fgets(cArray, LEN, pTextFile);
อาร์กิวเมนต์แรกของฟังก์ชัน fgets ชี้ไปที่อาร์เรย์อักขระที่จะเก็บสตริงที่ได้รับ อาร์กิวเมนต์ที่สองคือจำนวนอักขระสูงสุดที่จะอ่าน และอาร์กิวเมนต์ที่สามคือไฟล์ของเรา
หลังจากทำงานกับไฟล์เสร็จแล้ว คุณต้องปิดมัน:
fclose(pTextFile);
เราได้รับ:
ตัวอักษรรัสเซียก็ปรากฏอยู่ในบรรทัดด้วย
อีกอย่างผมสร้างโปรแกรมนี้ใน Eclipse คุณสามารถดูวิธีทำงานกับ C/C++ ได้ใน Eclipse
ดังนั้นเราจึงเปิดและอ่านข้อมูลจากไฟล์ข้อความ
ตอนนี้เรามาเรียนรู้วิธีสร้างไฟล์ข้อความโดยทางโปรแกรมและเขียนข้อมูลลงไป
/* ผู้แต่ง: @author Subbotin B.P..h> #include
สร้างไฟล์ข้อความเพื่อเขียนข้อมูลไปที่:
ไฟล์ *pTextFile = fopen("C:\\TextFileW.txt", "w");
หากไฟล์มีอยู่แล้ว ไฟล์นั้นจะถูกเปิดและข้อมูลทั้งหมดจากไฟล์นั้นจะถูกลบ
C-string cString และหมายเลข nVal ถูกเขียนโดยโปรแกรมไปยังไฟล์ข้อความ cNewLine เป็นเพียงบรรทัดใหม่
เราเขียนข้อมูลลงในไฟล์ข้อความโดยใช้ฟังก์ชัน fprintf:
fprintf(pTextFile, "%s%c", cString, cNewLine);
อาร์กิวเมนต์แรกที่นี่คือไฟล์ของเรา อาร์กิวเมนต์ที่สองคือสตริงรูปแบบ อาร์กิวเมนต์ที่สามขึ้นไปคือจำนวนอาร์กิวเมนต์ที่จำเป็นสำหรับรูปแบบนี้
ส่วนนี้จะครอบคลุมถึงสองวิธีในการทำงานกับไฟล์และคลาส MFC CFileDialog มาตรฐาน
1. การทำงานกับไฟล์ในภาษา C (ใช้ได้กับ C++ ด้วย)
#รวม
#รวม
โมฆะหลัก (เป็นโมฆะ)
{
ไฟล์ *ไฟล์;
ถ่าน* file_name = "file.txt";
ถ่าน load_string = "ไม่มี";
ไฟล์ = fopen(file_name, "w");
Fputs("string", ไฟล์);
ไฟล์ = fopen(file_name, "r");
ถ้า (ไฟล์ != 0)
{
fgets(load_string, 50 , ไฟล์);
ศาล)
อื่น
{
ศาล)
fclose (ไฟล์);
) คำอธิบายฟังก์ชั่นสำหรับการทำงานกับไฟล์อยู่ในไลบรารี stdio.h
ก่อนอื่นคุณต้องสร้างตัวชี้ไปยังตัวแปรประเภท FILE ( ไฟล์ไฟล์*;).
การเปิดไฟล์ทำได้โดยการเรียกใช้ฟังก์ชัน fopen ( file = fopen(file_name, "w");)
พารามิเตอร์แรกของฟังก์ชันนี้คือชื่อไฟล์ โดยพารามิเตอร์ตัวที่สองระบุว่าควรเปิดไฟล์ในโหมดใด "ว"- เปิดสำหรับการบันทึก "ร"- เปิดให้อ่าน "ก"- การเพิ่มไฟล์ (เป็นโหมดที่ใช้มากที่สุดแม้ว่าจะมีโหมดอื่น ๆ ก็ตาม) การเขียนและการอ่านข้อมูลจากไฟล์จะดำเนินการโดยฟังก์ชันต่อไปนี้: fputc, fputs, fgetc, fgets, fprintf, fscanf(สำหรับคำอธิบายของฟังก์ชันเหล่านี้ โปรดดู stdio.h).
การปิดไฟล์ทำได้โดยการเรียกใช้ฟังก์ชัน fclose ( fclose (ไฟล์);).
ไลบรารี MFC มีหลายคลาสสำหรับการทำงานกับไฟล์ คลาสที่กล่าวถึงด้านล่างนี้สืบทอดมาจากคลาสพื้นฐานการทำงานกับไฟล์โดยใช้ MFC (คลาส CFile, CStdioFile, ... ) และคลาส MFC มาตรฐาน CFileDialog
คลาส CF ile
ซีไฟล์ออกแบบมาเพื่อทำงานกับไฟล์ ทำให้ไฟล์ใช้งานได้ง่ายขึ้นโดยการแสดงไฟล์เป็นออบเจ็กต์ที่สามารถสร้าง อ่าน เขียน ฯลฯในการเข้าถึงไฟล์ คุณต้องสร้างอ็อบเจ็กต์ของคลาส CFile ก่อน ตัวสร้างคลาสช่วยให้คุณสามารถเปิดไฟล์ได้ทันทีหลังจากสร้างวัตถุดังกล่าว แต่คุณสามารถเปิดไฟล์ได้ในภายหลังโดยใช้วิธีการ
เปิด.การเปิดและสร้างไฟล์
หลังจากสร้างวัตถุคลาสแล้ว ซีไฟล์คุณสามารถเปิดไฟล์ได้โดยการเรียกเมธอดเปิด- วิธีการจะต้องระบุเส้นทางไปยังไฟล์ที่จะเปิดและโหมดการใช้งาน ต้นแบบวิธีการเปิดมีแบบฟอร์มดังนี้
เปิดบูลเสมือน (LPCTSTR lpszFileName, UINT nOpenFlags, CFileException * pError = NULL); เนื่องจากเป็นพารามิเตอร์ lpszFileName คุณต้องระบุชื่อของไฟล์ที่จะเปิด คุณสามารถระบุเพียงชื่อไฟล์หรือชื่อไฟล์เต็มที่มีเส้นทางแบบเต็มได้ พารามิเตอร์ตัวที่สอง nOpenFlags ระบุการดำเนินการที่เมธอด Open ดำเนินการกับไฟล์ รวมถึงแอตทริบิวต์ของไฟล์ ด้านล่างนี้เป็นค่าที่เป็นไปได้สำหรับพารามิเตอร์ nOpenFlags:
พารามิเตอร์เผื่อเลือก pError ซึ่งเป็นตัวชี้ไปยังอ็อบเจ็กต์คลาส CFileExceptionจะใช้เฉพาะในกรณีที่การดำเนินการกับไฟล์จะทำให้เกิดข้อผิดพลาด ในกรณีนี้ ข้อมูลเพิ่มเติมจะถูกเขียนไปยังวัตถุที่ชี้ไปโดย pError
วิธี เปิดส่งคืนค่าที่ไม่ใช่ศูนย์หากไฟล์เปิดอยู่และมีข้อผิดพลาดเป็นศูนย์ ข้อผิดพลาดในการเปิดไฟล์อาจเกิดขึ้นได้ เช่น ถ้ามีการระบุวิธีการเปิดเพื่ออ่านไฟล์ที่ไม่มีอยู่จริง
เปิดไฟล์ ID
คลาส CFile มีองค์ประกอบข้อมูล m_hFile ประเภท UINT มันเก็บตัวระบุของไฟล์ที่เปิด ถ้าวัตถุของคลาส CFile ถูกสร้างขึ้นแล้ว แต่ยังไม่ได้เปิดไฟล์ ดังนั้นค่าคงที่ hFileNull จะถูกเขียนในตัวแปร m_hFile
โดยทั่วไปแล้วตัวระบุไฟล์ที่เปิดจะไม่ถูกใช้โดยตรง วิธีการเรียน ซีไฟล์อนุญาตให้คุณดำเนินการเกือบทุกอย่างกับไฟล์และไม่จำเป็นต้องระบุตัวระบุไฟล์ เนื่องจาก m_hFile เป็นองค์ประกอบของคลาส การใช้เมธอดจึงสามารถเข้าถึงได้ฟรีเสมอ
กำลังปิดไฟล์
หลังจากทำงานกับไฟล์เสร็จแล้วจะต้องปิดมัน ระดับ ซีไฟล์มีวิธีการปิดแบบพิเศษสำหรับสิ่งนี้ ควรสังเกตว่าถ้าวัตถุของคลาส CFile ถูกสร้างขึ้นและเปิดไฟล์แล้ววัตถุนั้นถูกลบ ไฟล์ที่เกี่ยวข้องจะถูกปิดโดยอัตโนมัติโดยใช้ destructor
การอ่านและการเขียนไฟล์
มีหลายวิธีในการเข้าถึงไฟล์ในชั้นเรียน ซีไฟล์: อ่าน, อ่านมหาศาล, เขียน, เขียนมหาศาล, ฟลัช- วิธีการ อ่านและอ่านมากได้รับการออกแบบมาเพื่ออ่านข้อมูลจากไฟล์ที่เปิดก่อนหน้านี้ บนระบบปฏิบัติการ 32 บิต ทั้งสองวิธีสามารถอ่านจากไฟล์ได้มากกว่า 65535 ไบต์พร้อมกัน ข้อกำหนด ReadHuge ถือว่าล้าสมัยและคงไว้เพื่อความเข้ากันได้กับระบบปฏิบัติการ 16 บิตเท่านั้น
ข้อมูลที่อ่านจากไฟล์จะถูกเขียนไปยังบัฟเฟอร์ lpBuf พารามิเตอร์ nCount ระบุจำนวนไบต์ที่จะอ่านจากไฟล์ ในความเป็นจริง อาจอ่านไบต์จากไฟล์ได้น้อยกว่าที่พารามิเตอร์ nCount ร้องขอ สิ่งนี้จะเกิดขึ้นหากถึงจุดสิ้นสุดของไฟล์ระหว่างการอ่าน วิธีการส่งคืนจำนวนไบต์ที่อ่านจากไฟล์
เมธอด Write และ WriteHuge มีไว้สำหรับการเขียนลงไฟล์ บนระบบปฏิบัติการ 32 บิต ทั้งสองวิธีสามารถเขียนข้อมูลลงในไฟล์ได้มากกว่า 65535 ไบต์พร้อมกัน วิธีการเขียนไบต์จากบัฟเฟอร์ lpBuf ไปยังไฟล์ที่เปิด nCount หากเกิดข้อผิดพลาดในการเขียน เช่น ดิสก์เต็ม เมธอดจะเรียกใช้การจัดการข้อยกเว้น
วิธีฟลัช
เมื่อใช้วิธีการเขียนหรือWriteHugeในการเขียนข้อมูลลงดิสก์ อาจยังคงอยู่ในบัฟเฟอร์ชั่วคราวเป็นระยะเวลาหนึ่ง เพื่อให้แน่ใจว่ามีการเปลี่ยนแปลงที่จำเป็นกับไฟล์บนดิสก์ คุณต้องใช้วิธีฟลัช
การดำเนินการไฟล์
คลาสนี้ประกอบด้วยวิธีการที่อนุญาตให้คุณดำเนินการต่างๆ กับไฟล์ เช่น การคัดลอก การเปลี่ยนชื่อ การลบ การเปลี่ยนคุณลักษณะ
เมื่อต้องการเปลี่ยนชื่อไฟล์ คลาส CFile มีวิธีการแบบคงที่ เปลี่ยนชื่อซึ่งทำหน้าที่ของคำสั่งนี้ วิธีนี้ไม่สามารถใช้เปลี่ยนชื่อไดเร็กทอรีได้ หากมีข้อผิดพลาดเกิดขึ้น วิธีการจะส่งข้อยกเว้น
วิธีการคงที่จะรวมอยู่ในคลาส CFile เพื่อลบไฟล์ ลบซึ่งช่วยให้คุณสามารถลบไฟล์ที่ระบุได้ วิธีนี้ไม่อนุญาตให้คุณลบไดเร็กทอรี หากไม่สามารถลบไฟล์ได้ วิธีการนี้จะทำให้เกิดข้อยกเว้น
ในการกำหนดวันที่และเวลาของการสร้างไฟล์ ความยาว และคุณสมบัติของไฟล์ จะใช้วิธีการคงที่ รับสถานะ- มีวิธีการสองแบบ - วิธีแรกถูกกำหนดให้เป็นวิธีการเสมือน และวิธีที่สองถูกกำหนดเป็นวิธีคงที่
เวอร์ชันเสมือนของวิธีการ รับสถานะกำหนดสถานะของไฟล์ที่เปิดที่เกี่ยวข้องกับวัตถุคลาส CFile นี้ วิธีการนี้เรียกว่าเมื่อมีการสร้างวัตถุคลาส CFile และเปิดแฟ้มเท่านั้น
เวอร์ชันคงที่ของวิธีการ รับสถานะช่วยให้คุณสามารถกำหนดลักษณะของไฟล์ที่ไม่เกี่ยวข้องกับวัตถุของคลาส CFile หากต้องการใช้วิธีนี้ ไม่จำเป็นต้องเปิดไฟล์ก่อน
การปิดกั้น
ชั้นเรียนประกอบด้วยวิธีการ ล็อคเรนจ์และ ปลดล็อคช่วงซึ่งอนุญาตให้ล็อกข้อมูลไฟล์ตั้งแต่หนึ่งชิ้นขึ้นไปเพื่อให้กระบวนการอื่นเข้าถึงได้ หากแอปพลิเคชันพยายามที่จะล็อกข้อมูลที่ถูกล็อกก่อนหน้านี้โดยแอปพลิเคชันนี้หรือแอปพลิเคชันอื่น ข้อยกเว้นจะเกิดขึ้น การล็อคเป็นหนึ่งในกลไกที่ช่วยให้แอปพลิเคชั่นหรือกระบวนการหลายตัวสามารถทำงานในไฟล์เดียวกันพร้อมกันได้โดยไม่รบกวนซึ่งกันและกัน
คุณสามารถตั้งค่าการล็อคได้โดยใช้วิธีการ ล็อคเรนจ์- หากต้องการถอดล็อคที่ติดตั้งออกคุณต้องใช้วิธีนี้ปลดล็อคช่วง- หากมีการตั้งค่าการล็อคหลายรายการในไฟล์เดียว แต่ละการล็อคจะต้องถูกปลดล็อคโดยการเรียกเมธอดที่แยกจากกันปลดล็อคช่วง.
การวางตำแหน่ง
เมื่อต้องการย้ายตัวชี้ตำแหน่งไฟล์ปัจจุบันไปยังตำแหน่งใหม่ คุณสามารถใช้หนึ่งในวิธีการเรียนต่อไปนี้ ซีไฟล์ - แสวงหา แสวงหาเพื่อเริ่มต้น แสวงหาเพื่อสิ้นสุดถึงชั้นเรียน ซีไฟล์รวมถึงวิธีการที่ให้คุณตั้งค่าและเปลี่ยนความยาวไฟล์ -GetLength, SetLength.
เมื่อเปิดไฟล์ ตัวระบุตำแหน่งไฟล์ปัจจุบันจะอยู่ที่จุดเริ่มต้นของไฟล์ เมื่ออ่านหรือเขียนชิ้นส่วนของข้อมูล ตัวชี้ตำแหน่งปัจจุบันจะเลื่อนไปที่จุดสิ้นสุดของไฟล์ และชี้ไปที่ข้อมูลที่จะถูกอ่านหรือเขียนโดยการดำเนินการอ่านหรือเขียนครั้งถัดไปไปยังไฟล์
หากต้องการย้ายตัวชี้ตำแหน่งไฟล์ปัจจุบันไปยังตำแหน่งใด ๆ คุณสามารถใช้วิธีสากล
แสวงหา- ช่วยให้คุณสามารถย้ายตัวชี้ตามจำนวนไบต์ที่กำหนดโดยสัมพันธ์กับตำแหน่งเริ่มต้น จุดสิ้นสุด หรือตำแหน่งตัวชี้ปัจจุบันหากต้องการย้ายตัวชี้ไปที่จุดเริ่มต้นหรือจุดสิ้นสุดของไฟล์จะสะดวกที่สุดในการใช้วิธีการพิเศษ วิธี
แสวงหาเพื่อเริ่มต้นย้ายตัวชี้ไปที่จุดเริ่มต้นของไฟล์และวิธีการแสวงหาเพื่อสิ้นสุด- จนจบแต่เพื่อกำหนดความยาวของไฟล์ที่เปิดอยู่ ไม่จำเป็นต้องเลื่อนตัวชี้ คุณสามารถใช้วิธีการ
รับความยาว- วิธีนี้ยังส่งคืนความยาวของไฟล์ที่เปิดเป็นไบต์ด้วย วิธีตั้งค่าความยาวช่วยให้คุณสามารถเปลี่ยนความยาวของไฟล์ที่เปิดได้ หากวิธีนี้เพิ่มขนาดไฟล์ ค่าของไบต์สุดท้ายจะไม่ถูกกำหนดตำแหน่งตัวชี้ไฟล์ปัจจุบันสามารถกำหนดได้โดยใช้วิธีการ
รับตำแหน่ง- กลับคืนมาโดยวิธีรับตำแหน่งค่า 32 บิตระบุออฟเซ็ตตัวชี้จากจุดเริ่มต้นของไฟล์เปิดลักษณะไฟล์
ในการระบุตำแหน่งของไฟล์ที่เปิดอยู่บนดิสก์คุณต้องเรียกใช้เมธอด รับ FilePath- วิธีการนี้จะส่งกลับวัตถุของชั้นเรียนซีสตริงซึ่งมีเส้นทางแบบเต็มของไฟล์ รวมถึงชื่อไดรฟ์ ไดเร็กทอรี ชื่อไฟล์ และนามสกุลไฟล์
หากคุณเพียงต้องระบุชื่อและนามสกุลของไฟล์ที่เปิดอยู่ คุณสามารถใช้วิธีนี้ได้ รับชื่อไฟล์- จะส่งกลับวัตถุ CString ที่มีชื่อไฟล์ ในกรณีที่คุณต้องการค้นหาเฉพาะชื่อของไฟล์ที่เปิดอยู่โดยไม่มีนามสกุล ให้ใช้วิธีนี้รับ FileTitle.
วิธีการต่อไปนี้ของคลาส CFile ช่วยให้คุณสามารถตั้งค่าเส้นทางของไฟล์ได้ วิธีการนี้ไม่สร้าง คัดลอก หรือเปลี่ยนชื่อไฟล์ แต่จะเติมข้อมูลองค์ประกอบที่สอดคล้องกันในวัตถุคลาส CFile เท่านั้น
คลาสซี
MemFileไลบรารี MFC มีคลาสด้วย
CMemFileสืบทอดมาจากคลาสพื้นฐานซีไฟล์- ระดับ CMemFileหมายถึงไฟล์ที่อยู่ใน RAM ด้วยวัตถุคลาสCMemFileเช่นเดียวกับวัตถุคลาสซีไฟล์- ความแตกต่างก็คือไฟล์ที่เกี่ยวข้องกับวัตถุCMemFileไม่ได้อยู่บนดิสก์ แต่อยู่ใน RAM ของคอมพิวเตอร์ ด้วยเหตุนี้การดำเนินการกับไฟล์ดังกล่าวจึงเร็วกว่าไฟล์ปกติมากการทำงานกับคลาสออบเจ็กต์
CMemFileคุณสามารถใช้เมธอดเกือบทั้งหมดของคลาสได้ซีไฟล์ซึ่งได้อธิบายไว้ข้างต้น คุณสามารถเขียนข้อมูลลงในไฟล์ดังกล่าวหรืออ่านได้ นอกจากวิธีการเหล่านี้แล้ว คลาสยังประกอบด้วยCMemFileรวมวิธีการเพิ่มเติมด้วยมีตัวสร้างที่แตกต่างกันสองตัวสำหรับการสร้างวัตถุของคลาส CMemFile ตัวสร้าง CMemFile แรกมีพารามิเตอร์ทางเลือกเดียวเท่านั้น nGrowBytes:
CMemFile(UINT nGrowBytes=1024);ตัวสร้างนี้สร้างไฟล์ว่างใน RAM เมื่อสร้างแล้ว ไฟล์จะถูกเปิดโดยอัตโนมัติ (ไม่จำเป็นต้องเรียกใช้เมธอด Ope
น)เมื่อเริ่มเขียนลงในไฟล์ดังกล่าว บล็อกหน่วยความจำจะถูกจัดสรรโดยอัตโนมัติ เพื่อให้ได้เมธอดคลาสหน่วยความจำ
CMemFileเรียกใช้ฟังก์ชันมาตรฐานมัลลอค, เรียลลอคและ ฟรี- หากบล็อกหน่วยความจำที่จัดสรรไม่เพียงพอ ขนาดของบล็อกจะเพิ่มขึ้น บล็อกหน่วยความจำของไฟล์จะเพิ่มขึ้นในส่วนของไบต์ nGrowBytes หลังจากลบวัตถุคลาสแล้วCMemFileหน่วยความจำที่ใช้จะถูกส่งกลับเข้าสู่ระบบโดยอัตโนมัติตัวสร้างที่สองของคลาส CMemFile มีต้นแบบที่ซับซ้อนมากขึ้น ตัวสร้างนี้ใช้ในกรณีที่โปรแกรมเมอร์จัดสรรหน่วยความจำสำหรับไฟล์เอง:
CMemFile(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes=0);พารามิเตอร์ lpBuffer ระบุบัฟเฟอร์ที่จะใช้สำหรับไฟล์ ขนาดบัฟเฟอร์ถูกกำหนดโดยพารามิเตอร์ nBufferSize
พารามิเตอร์ nGrowBytes เผื่อเลือกถูกใช้อย่างครอบคลุมมากกว่าในตัวสร้างคลาสแรก หาก nGrowBytes มีศูนย์ ไฟล์ที่สร้างขึ้นจะมีข้อมูลจาก lpBuffer ความยาวของไฟล์ดังกล่าวจะเท่ากับ nBufferSize
ถ้า nGrowBytes มากกว่าศูนย์ เนื้อหาของ lpBuffer จะถูกละเว้น นอกจากนี้ หากมีการเขียนข้อมูลลงในไฟล์ดังกล่าวเกินกว่าที่จะใส่ลงในบัฟเฟอร์ที่จัดสรรได้ ขนาดไฟล์จะเพิ่มขึ้นโดยอัตโนมัติ บล็อกหน่วยความจำของไฟล์จะเพิ่มขึ้นในส่วนของไบต์ nGrowBytes
CMemFileอนุญาตให้คุณรับตัวชี้ไปยังพื้นที่หน่วยความจำที่ไฟล์ใช้ ด้วยตัวชี้นี้ คุณสามารถทำงานกับเนื้อหาของไฟล์ได้โดยตรง โดยไม่จำกัดเฉพาะวิธีการเรียนซีไฟล์- เมื่อต้องการรับตัวชี้ไปยังบัฟเฟอร์ไฟล์ คุณสามารถใช้วิธีแยกออก ก่อนดำเนินการนี้จะมีประโยชน์ในการกำหนดความยาวของไฟล์ (และขนาดของบัฟเฟอร์หน่วยความจำ) โดยการเรียกเมธอดรับความยาว. ถอดออกปิดไฟล์ที่กำหนดและส่งคืนตัวชี้ไปยังบล็อกหน่วยความจำที่ใช้อยู่ หากคุณต้องการเปิดไฟล์อีกครั้งและเชื่อมโยงบล็อก RAM กับไฟล์นั้น คุณจะต้องเรียกใช้เมธอดแนบ.ควรสังเกตว่าในการจัดการคลาสบัฟเฟอร์ไฟล์
CMemFileเรียกใช้ฟังก์ชันมาตรฐานมัลลอค, เรียลลอคและ ฟรี- ดังนั้น เพื่อไม่ให้กลไกการจัดการหน่วยความจำเสียหาย ฟังก์ชันจะต้องสร้างบัฟเฟอร์ lpBufferมอลลอคหรือ โทรล็อค.คลาส CStdioFile
ผู้ที่เคยใช้ฟังก์ชัน stream I/O จากไลบรารีมาตรฐาน C และ C++ ควรให้ความสนใจกับคลาส
CStdioFileสืบทอดมาจากคลาสพื้นฐานซีไฟล์- คลาสนี้อนุญาตให้คุณดำเนินการบัฟเฟอร์ I/O ในโหมดข้อความและไบนารี สำหรับวัตถุคลาสCStdioFileคุณสามารถเรียกเมธอดเกือบทั้งหมดของคลาส CFileCStdioFileรวมองค์ประกอบข้อมูล m_pStream ซึ่งมีตัวชี้ไปยังไฟล์ที่เปิด ถ้าเป็นวัตถุคลาสCStdioFileสร้างแล้ว แต่ไฟล์ยังไม่เปิดหรือปิด ดังนั้น m_pStream จึงมีค่าคงที่ NULLCStdioFileมีตัวสร้างที่แตกต่างกันสามตัว ตัวสร้างแรกของคลาส CStdioFile ไม่มีพารามิเตอร์ Constructor นี้สร้างเฉพาะคลาสอ็อบเจ็กต์ แต่ไม่ได้เปิดไฟล์ใดๆ หากต้องการเปิดไฟล์คุณต้องเรียกใช้เมธอดเปิดคลาสพื้นฐานซีไฟล์.ตัวสร้างชั้นสอง
CStdioFileสามารถเรียกได้หากไฟล์เปิดอยู่แล้วและคุณจำเป็นต้องสร้างอ็อบเจ็กต์ใหม่ของคลาส CStdioFile และเชื่อมโยงไฟล์ที่เปิดอยู่ด้วย ตัวสร้างนี้สามารถใช้ได้หากไฟล์ถูกเปิดด้วยฟังก์ชันมาตรฐานโฟเพน- พารามิเตอร์วิธีการต้องมีตัวชี้ไปยังไฟล์ที่ได้รับจากการเรียกใช้ฟังก์ชันมาตรฐานโฟเพน.ตัวสร้างที่สามสามารถใช้ได้หากคุณต้องการสร้างคลาสอ็อบเจ็กต์
CStdioFileให้เปิดไฟล์ใหม่และเชื่อมโยงกับวัตถุที่สร้างขึ้นใหม่สำหรับการอ่านและเขียนลงในไฟล์ข้อความ คลาส CStdioFile จะมีวิธีการใหม่สองวิธี:
ReadStringและ WriteString- วิธีแรกให้คุณอ่านสตริงอักขระจากไฟล์ได้ และวิธีที่สองให้คุณเขียนได้ตัวอย่างการเขียนและอ่านจากไฟล์
ต่อไปนี้คือส่วนของโค้ดที่สาธิตการใช้แผงโต้ตอบการเลือกไฟล์มาตรฐานและขั้นตอนในการอ่านและเขียนลงในไฟล์
การเปิดไฟล์และอ่านจากไฟล์นั้น
CString m_Text; -// สร้างแผงการเลือกไฟล์มาตรฐานเปิด CFileDialog DlgOpen(TRUE,(LPCSTR)"txt",NULL, OFN_HIDEREADONLY,(LPCSTR)" ไฟล์ข้อความ (*.txt) |*.txt||");// แสดงแผงการเลือกไฟล์มาตรฐานเปิด ถ้า(DlgOpen.DoModal()==IDOK) (// สร้างวัตถุและเปิดไฟล์เพื่ออ่าน แฟ้ม CStdioFile(DlgOpen.GetPathName(),CFile::modeRead|CFile::typeBinary);// อ่านสตริงจากไฟล์ CString& ref=m_Text; File.ReadString(อ้างอิง- // การอ้างอิงถึงสตริงถูกส่งผ่าน
CString m_Text; m_ข้อความ)การเปิดและเขียนจากไฟล์ // สร้างแผงการเลือกไฟล์ SaveAs มาตรฐาน CFileDialog DlgSaveAs(FALSE,(LPCSTR)"txt",NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, (LPCSTR)" ไฟล์ข้อความ (*.txt) |*.txt||"); // แสดงแผงการเลือกไฟล์ SaveAs มาตรฐานถ้า(DlgSaveAs.DoModal()==IDOK) ( // สร้างวัตถุและเปิดไฟล์เพื่อเขียนแฟ้ม CStdioFile (DlgSaveAs.GetPathName(), CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);- // เขียนลงในไฟล์สตริง
ไฟล์.WriteString((LPCTSTR)m_Text);
-
มีรหัสการทำงานของโปรแกรมที่ออกแบบมาเพื่อความเรียบง่ายเป็นแอปพลิเคชันคอนโซลภายใต้ MFC เพื่อให้โปรแกรมใช้งานได้อย่าลืมทำดังนี้:
เรียกใช้โปรแกรม - สร้าง / สร้างใหม่ทั้งหมด (จะมีข้อผิดพลาด) เลือกสร้าง / ตั้งค่าการกำหนดค่าที่ใช้งานอยู่ - Win 32 Realise เลือกรายการเมนู "โครงการ" จากนั้นเลือก "การตั้งค่า ... " แท็บ "C/C++" หมวดหมู่ - การสร้างโค้ด และในรายการ "ใช้ไลบรารีรันไทม์" เลือก "มัลติเธรด" หลังจากนั้นให้ทำ Build / Rebuild ทั้งหมดอีกครั้ง แล้วโปรแกรมก็จะทำงาน
ก่อนหน้านี้ เมื่อป้อนข้อมูลและส่งออกข้อมูล เราทำงานร่วมกับสตรีมมาตรฐาน - แป้นพิมพ์และจอภาพ ตอนนี้เรามาดูกันว่าภาษา C ใช้ในการรับข้อมูลจากไฟล์และเขียนไว้ที่นั่นอย่างไร ก่อนที่คุณจะสามารถดำเนินการเหล่านี้ได้ คุณต้องเปิดไฟล์และเข้าถึงไฟล์ก่อน
ในภาษาการเขียนโปรแกรม C ตัวชี้ไปยังไฟล์จะเป็นประเภท FILE และการประกาศจะมีลักษณะดังนี้:
ไฟล์ *ไฟล์ของฉัน;
หากด้วยเหตุผลใดก็ตาม (ไม่มีไฟล์ตามที่อยู่ที่ระบุ การเข้าถึงไฟล์นั้นถูกปฏิเสธ) ฟังก์ชัน fopen() ไม่สามารถเปิดไฟล์ได้ ฟังก์ชันจะคืนค่า NULL ในโปรแกรมจริง พวกเขามักจะจัดการกับข้อผิดพลาดในการเปิดไฟล์ในสาขา if แต่เราจะละเว้นสิ่งนี้ต่อไป
การประกาศฟังก์ชัน fopen() มีอยู่ในไฟล์ส่วนหัว stdio.h ดังนั้นจึงต้องรวมไว้ด้วย นอกจากนี้ใน stdio.h มีการประกาศประเภทโครงสร้าง FILE
หลังจากทำงานกับไฟล์เสร็จสิ้น เป็นธรรมเนียมที่จะต้องปิดไฟล์เพื่อล้างบัฟเฟอร์จากข้อมูลและด้วยเหตุผลอื่นๆ นี่เป็นสิ่งสำคัญอย่างยิ่งหากโปรแกรมยังคงทำงานต่อไปหลังจากทำงานกับไฟล์แล้ว การตัดการเชื่อมต่อระหว่างไฟล์ภายนอกและตัวชี้ไปยังไฟล์จากโปรแกรมทำได้โดยใช้ฟังก์ชัน fclose() ตัวชี้ไปยังไฟล์ถูกส่งผ่านไปเป็นพารามิเตอร์:
fclose (ไฟล์ของฉัน);
สามารถเปิดไฟล์ได้มากกว่าหนึ่งไฟล์ในโปรแกรม ในกรณีนี้ แต่ละไฟล์จะต้องเชื่อมโยงกับตัวชี้ไฟล์ของตัวเอง อย่างไรก็ตาม หากโปรแกรมทำงานกับไฟล์เดียวก่อนแล้วจึงปิดไป ตัวชี้ก็สามารถใช้เพื่อเปิดไฟล์ที่สองได้
การอ่านและการเขียนลงในไฟล์ข้อความ
เอฟสแกนเอฟ()
ฟังก์ชัน fscanf() มีความหมายคล้ายกับฟังก์ชัน scanf() แต่ต่างจากฟังก์ชันตรงตรงที่ให้อินพุตที่จัดรูปแบบจากไฟล์ แทนที่จะเป็นสตรีมอินพุตมาตรฐาน ฟังก์ชัน fscanf() รับพารามิเตอร์: ตัวชี้ไฟล์, สตริงรูปแบบ, ที่อยู่ของพื้นที่หน่วยความจำสำหรับการเขียนข้อมูล:
fscanf(myfile, "%s%d", str, &a);
ส่งกลับจำนวนข้อมูลที่อ่านสำเร็จหรือ EOF ช่องว่างและอักขระขึ้นบรรทัดใหม่จะนับเป็นตัวคั่นข้อมูล
สมมติว่าเรามีไฟล์ที่มีคำอธิบายของวัตถุดังต่อไปนี้:
แอปเปิ้ล 10 23.4 กล้วย 5 25.0 ขนมปัง 1 10.3
#รวม
ฉัน++;
-
ฟังก์ชัน fgets() คล้ายกับฟังก์ชัน gets() และทำการป้อนข้อมูลทีละบรรทัดจากไฟล์ การเรียก fgets() หนึ่งครั้งจะอ่านหนึ่งบรรทัด ในกรณีนี้คุณไม่สามารถอ่านทั้งบรรทัดได้ แต่จะอ่านได้เพียงบางส่วนตั้งแต่ต้นเท่านั้น พารามิเตอร์ fgets() มีลักษณะดังนี้:
fgets (Character_array, number_of_Characters_read, pointer_to_file)
ตัวอย่างเช่น:
fgets(str, 50, มายไฟล์)
การเรียกฟังก์ชันนี้จะอ่านจากไฟล์ที่เกี่ยวข้องกับตัวชี้ myfile หนึ่งบรรทัดของข้อความหากความยาวน้อยกว่า 50 อักขระ รวมถึงอักขระ "\n" ซึ่งฟังก์ชันจะจัดเก็บไว้ในอาร์เรย์ด้วย องค์ประกอบสุดท้าย (อันดับที่ 50) ของอาร์เรย์ str จะเป็นอักขระ "\0" ที่เพิ่มโดย fgets() หากสตริงยาวกว่านี้ ฟังก์ชันจะอ่านอักขระ 49 ตัวและเขียน "\0" ต่อท้าย ในกรณีนี้ "\n" จะไม่อยู่ในบรรทัดการอ่าน
#รวม
-
ในโปรแกรมนี้ ต่างจากโปรแกรมก่อนหน้านี้ ข้อมูลจะถูกอ่านทีละบรรทัดในอาร์เรย์ arr เมื่ออ่านบรรทัดถัดไป บรรทัดก่อนหน้าจะหายไป ฟังก์ชัน fgets() จะคืนค่า NULL หากไม่สามารถอ่านบรรทัดถัดไปได้
getc() หรือ fgetc()
ฟังก์ชัน getc() หรือ fgetc() (ใช้งานได้ทั้งคู่) ช่วยให้คุณรับอักขระตัวถัดไปจากไฟล์ได้ \n"ในขณะที่ ((arr[ i] = fgetc (ไฟล์) ) != EOF) ( ถ้า (arr[ i] == " \0 " ) (arr[i] = " \n"- printf("%s \0 " ) (arr[i] = " \n", ถึงแล้ว) ;
ฉัน = 0 ;
) อื่น ๆ ฉัน++;
)arr[i] = "
- , ถึงแล้ว) ;
- โค้ดตัวอย่างจะแสดงข้อมูลจากไฟล์บนหน้าจอ
- การเขียนลงในไฟล์ข้อความ
เช่นเดียวกับอินพุต เอาต์พุตไปยังไฟล์อาจแตกต่างกัน
เอาต์พุตที่จัดรูปแบบแล้ว ฟังก์ชัน fprintf (file_index, format_string, ตัวแปร)
เอาต์พุตแบบโพสต์ต่อบรรทัด ฟังก์ชั่น fputs(string, file_pointer) \n"เอาต์พุตอักขระต่ออักขระ ฟังก์ชัน fputc() หรือ putc(สัญลักษณ์, file_pointer)
ด้านล่างนี้เป็นตัวอย่างโค้ดที่ใช้สามวิธีในการส่งออกข้อมูลไปยังไฟล์
การเขียนฟิลด์ของโครงสร้างเดียวลงในแต่ละบรรทัดของไฟล์: \n"ไฟล์ = fopen ("fprintf.txt" , "w" ) ;
ในขณะที่ (scanf ("%s%u%f" , ร้านค้า[ i].name , & (ร้านค้า[ i].qty ) , & (ร้านค้า[ i].price ) ) != EOF) ( fprintf (ไฟล์ " %s %u %.2f
ในขณะที่ ((i = getchar () ) != EOF) putc (i, ไฟล์);
อ่านและเขียนลงในไฟล์ไบนารี
คุณสามารถทำงานกับไฟล์ได้ไม่ใช่เป็นลำดับอักขระ แต่เป็นลำดับไบต์ โดยหลักการแล้ว ไม่สามารถทำงานกับไฟล์ที่ไม่ใช่ข้อความได้ด้วยวิธีอื่น อย่างไรก็ตาม คุณสามารถอ่านและเขียนลงในไฟล์ข้อความได้ด้วยวิธีนี้ ข้อดีของวิธีการเข้าถึงไฟล์นี้คือความเร็วในการอ่าน-เขียน: บล็อกข้อมูลที่สำคัญสามารถอ่าน/เขียนได้ในการเข้าถึงครั้งเดียว
เมื่อเปิดไฟล์สำหรับการเข้าถึงแบบไบนารี พารามิเตอร์ตัวที่สองที่จะ fopen() คือสตริง "rb" หรือ "wb"
หัวข้อการทำงานกับไฟล์ไบนารี่ค่อนข้างซับซ้อนและต้องมีบทเรียนแยกต่างหากเพื่อศึกษา ที่นี่จะมีการบันทึกเฉพาะคุณสมบัติของฟังก์ชั่นการอ่านและเขียนไฟล์ซึ่งถือเป็นสตรีมไบต์เท่านั้น
ฟังก์ชัน fread() และ fwrite() ใช้เป็นพารามิเตอร์:
- ที่อยู่ของพื้นที่หน่วยความจำที่ข้อมูลถูกเขียนหรืออ่าน
- ขนาดเท่าของประเภทใดประเภทหนึ่ง
- จำนวนข้อมูลที่อ่านตามขนาดที่ระบุ
- ดัชนีไฟล์.
ฟังก์ชันเหล่านี้จะส่งคืนจำนวนข้อมูลที่อ่านหรือเขียนได้สำเร็จ เหล่านั้น. คุณสามารถ "สั่ง" การอ่านองค์ประกอบข้อมูล 50 รายการได้ แต่จะได้รับเพียง 10 รายการ จะไม่มีข้อผิดพลาด
ตัวอย่างการใช้ฟังก์ชัน fread() และ fwrite()
#รวม
fwrite (strcat (ชั้นวาง2, ชั้นวาง1) , ขนาดของ (ถ่าน ) , n+ m, ไฟล์);
fclose (ไฟล์);
- -
- นี่เป็นการพยายามอ่านอักขระ 50 ตัวจากไฟล์แรก n เก็บจำนวนอักขระที่อ่านจริง ค่าของ n สามารถเป็น 50 หรือน้อยกว่าได้ ข้อมูลจะถูกวางเรียงกันเป็นแถว สิ่งเดียวกันนี้เกิดขึ้นกับไฟล์ที่สอง ถัดไป บรรทัดแรกจะถูกต่อท้ายบรรทัดที่สอง และข้อมูลจะถูกเทลงในไฟล์ที่สาม
เราได้เรียนรู้วิธีการเขียนข้อมูลลงในไฟล์ข้อความแล้ว – หากคุณยังไม่ได้เรียนรู้วิธีการ โปรดดูบทความก่อนหน้านี้ มีการเล่าและอธิบายอย่างละเอียด
แต่จะเกิดอะไรขึ้นถ้ามีไฟล์อยู่แล้วและเราจำเป็นต้องอ่านข้อมูลจากไฟล์นั้นเพื่อการประมวลผล? โชคดีที่นี่ก็ค่อนข้างง่ายเช่นกัน ฉันขอเตือนคุณว่ามีหลายตัวเลือกในการดำเนินงานนี้ ฉันได้อธิบายไว้เพียงตัวเลือกเดียวเท่านั้น สิ่งที่อธิบายไว้คือสิ่งที่เข้าใจง่ายที่สุดสำหรับฉันเป็นการส่วนตัวด้วยเหตุผลบางประการ
#รวม
int หลัก()
{
ถ่าน s1 //ตัวแปรจะอ่านสตริง
ifstream ใน (“C:\\\FromC\\myfile.txt” ); -เปิดไฟล์เพื่ออ่านข้อมูล
ใน >>s1 ; -อ่านบรรทัด
in.close() //กำลังปิดไฟล์
ศาล<
กลับ 0 ;
}
นี่เป็นโปรแกรมที่ง่ายที่สุดในการอ่านบรรทัดแรกจากไฟล์ข้อความที่อยู่ตามเส้นทาง
C:\\\FromC\\myfile.txt –
เนื่องจากนี่เป็นความต่อเนื่องของบทความที่แล้ว ฉันจึงตัดสินใจใช้ไฟล์ที่เราสร้างขึ้นที่นั่น ไม่น่าจะมีปัญหาใด ๆ กับเรื่องนี้
แต่กลับมาที่โค้ดกัน ขั้นแรกเราเปิดไฟล์เพื่ออ่านข้อมูลจากนั้นเราใช้คำสั่ง ถ้าสตรีมในวงเล็บเราจะระบุชื่อไฟล์หรือเส้นทางไปยังไฟล์เหมือนอย่างที่ฉันเคยทำ (“C:\\\FromC\\myfile.txt” );
เมื่อเราเปิดไฟล์เพื่ออ่านอะไรบางอย่างจากไฟล์นั้น เราก็ได้ประกาศตัวแปรหนึ่งตัวเช่น ถ่าน –
ถ่าน s1
ตอนนี้สิ่งที่เราต้องทำคือกำหนดค่าของสตริงจากไฟล์ให้กับตัวแปร เราทำสิ่งนี้กันเป็นทีม ใน
ให้ความสนใจกับวงเล็บมุม ใน >>
จริงๆ แล้วอย่างที่ควรจะชัดเจนตั้งแต่คอมเม้นท์ถึงโค้ดโปรแกรม เพื่อให้ตัวแปรกำหนดค่าที่อ่านได้เราต้องเขียนไว้ทีหลัง ใน >>
ใน >>s1 ;
ดูเหมือนจะไม่ใช่เรื่องยากโดยเฉพาะหากคุณเชี่ยวชาญและเรียนรู้การใช้เนื้อหาจากบทความที่แล้วอย่างสมบูรณ์ - ทุกอย่างเหมือนกันทุกประการมีเพียง 2 คำสั่งเท่านั้นที่แตกต่างกัน
การสร้างไฟล์และเขียนข้อมูล C++ ลงไป
ของกระแส ออก
(ชื่อไฟล์ );
ออก<< (สตริงที่จะเขียน);
ออก.ปิด();
=============================
การอ่านข้อความจากไฟล์และการพิมพ์ข้อความไปยังหน้าจอใน C ++
ถ้าสตรีม ใน
(ชื่อไฟล์ );
ใน>>
(กำลังอ่านบรรทัด);
ใน.ปิด();(ปิดไฟล์)
============================
มาเขียนโปรแกรมง่ายๆ ที่จะอ่านข้อความที่ป้อนจากคีย์บอร์ดและเขียนลงในไฟล์:
#รวม
#รวม
int หลัก()
{
\\
3 บรรทัดในอนาคต
clrscsr(); -การล้างหน้าจอ
ศาล<<“Wwedi pervuu stroku”
;
ซิน >>ก ; สิ้นสุด ;
ศาล<<“Wwedi wtoruu stroku”
;
ซิน >>ข ; สิ้นสุด ;
ศาล<<“Wwedi tretuu stroku”
;
ซิน >>ค ; สิ้นสุด ;
clrscr(); -
/*เริ่มทำงานกับไฟล์*/
ofstream ออก (“C:\\\FromC\\myfile.txt” ); -การเปิดไฟล์เพื่อเขียน
ออก<เขียนบรรทัดแรก
ออก<เขียนบรรทัดที่สอง
ออก<
ออก.ปิด(); -กำลังปิดไฟล์
//รีเซ็ตตัวแปร
สำหรับ (int i =0 ;i<=255
;i
++)
(ก =*“” ; ข =*“” ; ค =*“” ;)
ถ้าสตรีมใน (“C:\\\FromC\\myfile.txt” );
ใน >>ก >>ข >>ค ; -เราอ่านแต่ละบรรทัดใหม่เป็นตัวแปรใหม่
ใน.ปิด(); -กำลังปิดไฟล์
/* */
สำหรับ (i =0 ;a !=*“” ;i ++)
{
ถ้า (i >ขนาดของ(a )) หยุดพัก ;
ศาล<
}
ศาล<<“\n”
; \\
/* */
{
ถ้า (i >ขนาดของ(b)) หยุดพัก ;
ศาล<
}
ศาล<<“\n”
; \\
ย้ายเคอร์เซอร์ไปที่บรรทัดใหม่
/* */
สำหรับ (i =0 ;с !=*“” ;i ++)
{
ถ้า (i >ขนาดของ(c )) หยุดพัก ;
ศาล<<с
;
}
กลับ 0 ;
}
===================
ในตัวอย่างข้างต้นมีอยู่อย่างหนึ่ง ใหญ่ ข้อบกพร่อง หากเราพยายามป้อนบรรทัดที่มีการเว้นวรรค โปรแกรมจะไม่ทำงานตามที่เราต้องการ อาจไม่ใช่แค่ฉันเท่านั้น แต่ยังมีคนอื่นอีกหลายคนที่เจอข้อผิดพลาดนี้ ดังนั้นฉันจึงทิ้งรหัสที่ไม่ถูกต้องไว้เพื่อให้คุณเห็นว่าคุณอาจพบอะไรบ้าง
เนื่องจากที่บ้านไม่มีหนังสือฉันจึงเริ่มค้นหาอินเทอร์เน็ตอีกครั้งและพบเรื่องไร้สาระที่ซับซ้อนมากมาย แต่อย่างใดฉันก็พบวิธีแก้ไขปัญหาของฉัน
มันช่วยให้ฉันได้อ่านสิ่งนั้น ศาลสนับสนุนวิธีการของเขา และคำแนะนำทั้งหมดบนอินเทอร์เน็ตเกี่ยวกับการใช้ฟังก์ชันนี้ รับสายโชคดีสำหรับฉัน ฉันค้นพบวิธีใช้ฟังก์ชันนี้ได้อย่างรวดเร็ว จากนั้นจึงนำไปใช้ในโค้ด
โดยทั่วไปก็น่าพูดถึงและอธิบายฟังก์ชั่นนี้นะ แต่จนถึงตอนนี้ ผมยังไม่เข้าใจจริงๆ แค่เข้าใจว่ามันต้องใช้ และเข้าใจวิธี ดังนั้นผมจะยกตัวอย่างโปรแกรมของเราที่กำลังพัฒนาให้ถูกต้องมากขึ้น : :
#รวม
#รวม
int หลัก()
{
ถ่าน a,b,c; \\
3 บรรทัดในอนาคต
clrscsr(); -การล้างหน้าจอ
/* ใส่ค่าตัวแปร*/
ศาล<<“Wwedi pervuu stroku”
;
cin.getline(ก,ขนาดของ(ก));สิ้นสุด ;
ศาล<<“Wwedi wtoruu stroku”
;
cin.getline(a,ขนาดของ(b));สิ้นสุด ;
ศาล<<“Wwedi tretuu stroku”
;
cin.getline(a,ขนาดของ(c));สิ้นสุด ;
clrscr(); -หลังจากป้อนค่าแล้ว หน้าจอก็ถูกล้าง
/*เริ่มทำงานกับไฟล์*/
ofstream ออก (“C:\\\FromC\\myfile.txt”); -การเปิดไฟล์เพื่อเขียน
ออก<เขียนบรรทัดแรก
ออก<เขียนบรรทัดที่สอง
ออก<
ออก.ปิด(); -กำลังปิดไฟล์
//รีเซ็ตตัวแปร
สำหรับ (int i =0 ;i<=255
;i
++)
(ก =*“” ; ข =*“” ; ค=*“” ;)
/*ทำงานกับไฟล์ต่อไป*/
ถ้าสตรีมเข้า (“C:\\\FromC\\myfile.txt” );
in.getline(a,ขนาดของ(a));//
ก
in.getline(b,ขนาดของ(b));//
การอ่านบรรทัดลงในตัวแปร ข
in.getline(c,ขนาดของ(c));
//
การอ่านบรรทัดลงในตัวแปร ค
ใน.ปิด(); -กำลังปิดไฟล์
/* เราอ่านอักขระบรรทัดแรกทีละอักขระและแสดงบนหน้าจอ */
สำหรับ (i =0 ;a !=*“” ;i++)
{
ถ้า (i >ขนาดของ(a )) หยุดพัก ;
ศาล<
}
ศาล<<“\n”
; \\
ย้ายเคอร์เซอร์ไปที่บรรทัดใหม่
/* เราอ่านอักขระบรรทัดที่สองทีละอักขระและแสดงบนหน้าจอ */
สำหรับ (i =0 ;b !=*“” ;i ++)
{
ถ้า (i >ขนาดของ(b)) หยุดพัก ;
ศาล<
}
ศาล<<“\n”
; \\
ย้ายเคอร์เซอร์ไปที่บรรทัดใหม่
/* เราอ่านอักขระบรรทัดที่สามทีละอักขระและแสดงบนหน้าจอ */
สำหรับ (i =0 ;с !=*“” ;i++)
{
ถ้า (i>ขนาดของ (c )) หยุดพัก ;
ศาล<<с[i];
}
รับ(); -รอให้กดปุ่ม Enter
กลับ 0 ;
}
===================
เนื้อหานี้อธิบายตัวอย่างการอ่านข้อมูลทีละตัวอักษร เนื่องจากฉันไม่ได้อธิบายการทำงานกับตัวแปรเช่น ถ่านผู้เริ่มต้นอาจประสบปัญหาในการทำความเข้าใจโค้ด ฉันแค่ไม่รู้ว่าประเภทไหน ถ่านมีลักษณะเฉพาะบางอย่างและคิดว่าทุกอย่างง่ายขึ้น ดังนั้นจึงสามารถอ่านช่วงเวลาที่เข้าใจยากของโปรแกรมข้างต้นได้ในบทความต่อไปนี้ ทำงานกับถ่านวี C++ สำหรับผู้เริ่มต้น
มิฉะนั้น ตัวอย่างที่ให้ไว้ของวิธีการอ่านบรรทัดจากไฟล์ข้อความในภาษา C++ ควรสามารถเข้าถึงได้และค่อนข้างเข้าใจได้ นี่ไม่ใช่ตัวเลือกการใช้งานที่ดีที่สุดในขณะนี้ และฉันพลาดจุดสำคัญบางจุดไป แต่เนื่องจากเรากำลังเริ่มเรียนรู้ภาษา C++ ตอนนี้ก็เพียงพอแล้ว ต่อมาฉันคงจะไปถึงสิ่งที่พลาดไป แต่ตอนนี้ฉันต้องรับรู้เฉพาะสิ่งที่จำเป็นที่สุดเท่านั้น
หากคุณและฉันเข้าใจเนื้อหานี้ แสดงว่าเราได้ก้าวไปสู่ความเป็นมืออาชีพเพียงเล็กน้อย
บันทึก:
หยุดพัก ;– นี่คือคำสั่งที่ออกจากลูป เรามีถ้าตัวนับรอบ สำหรับมีขนาดใหญ่กว่าขนาดที่ประกาศของตัวแปร ถ่าน,จากนั้นเราก็ออกจากวงอย่างเข้มแข็ง
!= –
นี่คือเงื่อนไขที่เราตั้งไว้ เงื่อนไขนี้แสดงโดยความไม่เท่าเทียมกัน
ถ้า(ก !=ข)- อ่านเหมือนว่า. กไม่เท่ากัน ข
สิ้นสุด ; -นี่เป็นการย้ายเคอร์เซอร์ไปที่บรรทัดใหม่ภายในคอนโซล (เท่าที่ฉันเข้าใจ)
คำสั่งนี้คล้ายกับ “\n”
การทำงานกับไฟล์ข้อความใน C ++
ไฟล์มีสองประเภทหลัก: ข้อความและไบนารี ไฟล์อนุญาตให้ผู้ใช้สามารถอ่านข้อมูลจำนวนมากได้โดยตรงจากดิสก์โดยไม่ต้องป้อนข้อมูลจากแป้นพิมพ์
ข้อความไฟล์ที่ประกอบด้วยอักขระใดๆ จะถูกเรียก จัดเรียงเป็นบรรทัด โดยแต่ละบรรทัดลงท้ายด้วยอักขระท้ายบรรทัด จุดสิ้นสุดของไฟล์จะมีสัญลักษณ์ "สิ้นสุดไฟล์" ระบุ เมื่อเขียนข้อมูลลงในไฟล์ข้อความ ซึ่งสามารถดูได้โดยใช้โปรแกรมแก้ไขข้อความ ข้อมูลทั้งหมดจะถูกแปลงเป็นประเภทอักขระและจัดเก็บในรูปแบบอักขระ
ใน ไบนารี่ในไฟล์ ข้อมูลจะถูกอ่านและเขียนในรูปแบบของบล็อกขนาดหนึ่ง ซึ่งสามารถจัดเก็บข้อมูลประเภทและโครงสร้างใดก็ได้
ในการทำงานกับไฟล์พิเศษ ประเภทข้อมูล, เรียกว่า ลำธาร- ไหล ถ้าสตรีมใช้เพื่อทำงานกับไฟล์ในโหมดการอ่านและ ของกระแสในโหมดบันทึก ในการทำงานกับไฟล์ทั้งในโหมดการเขียนและการอ่านจะใช้สตรีม สตรีม.
ในโปรแกรม C++ เมื่อทำงานกับไฟล์ข้อความ คุณต้องรวมไลบรารี iostream และ fstream ไว้ด้วย
เพื่อ บันทึกข้อมูลเป็นไฟล์ข้อความ คุณต้องมี:
อธิบายตัวแปรประเภทกระแสน้ำ
ข้อมูลส่งออกไปยังไฟล์
อย่าลืมปิดไฟล์
สำหรับ การอ่านข้อมูลจากไฟล์ข้อความ คุณต้องมี:
อธิบายตัวแปรประเภท ifstream
เปิดไฟล์โดยใช้ฟังก์ชันเปิด
ปิดไฟล์
บันทึกข้อมูลเป็นไฟล์ข้อความ
ตามที่กล่าวไว้ข้างต้น เพื่อเริ่มทำงานกับไฟล์ข้อความ คุณต้องกำหนดตัวแปรประเภทสตรีม ตัวอย่างเช่นเช่นนี้:
ตัวแปร F จะถูกสร้างขึ้นเพื่อเขียนข้อมูลลงในไฟล์
ในขั้นตอนต่อไปจะต้องเปิดไฟล์เพื่อเขียน โดยทั่วไป ตัวดำเนินการเปิดสตรีมจะมีลักษณะดังนี้:
F.open("ไฟล์", โหมด);
โดยที่ F เป็นตัวแปรที่อธิบายว่าเป็นกระแส
ไฟล์ - ชื่อเต็มของไฟล์บนดิสก์
โหมด - โหมดการทำงานกับไฟล์ที่กำลังเปิด
โปรดทราบว่าเมื่อระบุชื่อไฟล์เต็ม คุณต้องใช้เครื่องหมายทับคู่ ตัวอย่างเช่นชื่อเต็มของไฟล์ noobs.txt ซึ่งอยู่ในโฟลเดอร์เกมบนไดรฟ์ D: จะต้องเขียนดังนี้:
D:\\เกม\\noobs.txt
ไฟล์สามารถเปิดได้ในโหมดใดโหมดหนึ่งต่อไปนี้:
ios::in - เปิดไฟล์ในโหมดอ่านข้อมูล โหมดนี้เป็นโหมดเริ่มต้นสำหรับ ifstreams
ios::out - เปิดไฟล์ในโหมดการเขียนข้อมูล (ในกรณีนี้ข้อมูลเกี่ยวกับไฟล์ที่มีอยู่จะถูกทำลาย) โหมดนี้เป็นโหมดเริ่มต้นสำหรับ ofstreams
ios::app - เปิดไฟล์ในโหมดเขียนข้อมูลลงท้ายไฟล์
ios::ate - ย้ายไปที่ส่วนท้ายของไฟล์ที่เปิดอยู่แล้ว
ios::trunc - ล้างไฟล์ สิ่งนี้จะเกิดขึ้นในโหมด ios::out เช่นกัน
ios::nocreate - อย่าเปิดไฟล์หากไม่มีอยู่
ios::noreplace - ห้ามเปิดไฟล์ที่มีอยู่
พารามิเตอร์โหมดอาจหายไป ในกรณีนี้ ไฟล์จะถูกเปิดในโหมดเริ่มต้นสำหรับสตรีมนี้
หลังจากเปิดไฟล์สำเร็จ (ในโหมดใดก็ได้) ตัวแปร F จะเก็บค่าจริง มิเช่นนั้นจะเป็นค่าเท็จ ซึ่งจะช่วยให้คุณสามารถตรวจสอบความถูกต้องของการดำเนินการเปิดไฟล์ได้
คุณสามารถเปิดไฟล์ (ลองใช้ไฟล์ D:\\game\\noobs.txt เป็นตัวอย่าง) ในโหมดบันทึกด้วยวิธีใดวิธีหนึ่งต่อไปนี้:
// อันดับแรก ทาง
กระแส F;
F.open("D:\\game\\noobs.txt", ios::out);
// วิธีที่สอง โหมด ios::out เป็นโหมดเริ่มต้น
// สำหรับ ไหลของกระแส
กระแส F;
// วิธีที่สามรวมคำอธิบายของตัวแปรและประเภทสตรีม
//และเปิดไฟล์ในคำสั่งเดียว
ofstream F("D:\\game\\noobs.txt", ios::out);
หลังจากเปิดไฟล์ในโหมดเขียน ไฟล์เปล่าจะถูกสร้างขึ้นซึ่งคุณสามารถเขียนข้อมูลได้
หากคุณต้องการเปิดไฟล์ที่มีอยู่ในโหมดเขียนก่อน คุณควรใช้ ios::app เป็นโหมด
หลังจากเปิดไฟล์ในโหมดบันทึก คุณสามารถเขียนไฟล์ในลักษณะเดียวกับบนหน้าจอ แทนอุปกรณ์เอาท์พุตมาตรฐานเท่านั้นศาลคุณต้องระบุชื่อของไฟล์ที่เปิด
ตัวอย่างเช่น ในการเขียนตัวแปร a ไปยังสตรีม F คำสั่งเอาต์พุตจะมีลักษณะดังนี้:
สำหรับเอาต์พุตตามลำดับเพื่อสตรีม G ของตัวแปร b, c, d ตัวดำเนินการเอาต์พุตจะเป็นดังนี้:
ช<
การปิดสตรีมทำได้โดยใช้โอเปอเรเตอร์:
ตัวอย่าง:
สร้างไฟล์ข้อความ D:\\game\\noobs.txt และเขียนตัวเลขจำนวนจริงลงไป
#รวม "stdafx.h"
#รวม
#รวม
#รวม
ใช้เนมสเปซมาตรฐาน;
int หลัก()
setlocale(LC_ALL, "มาตุภูมิ");
ฉัน, n;
ดับเบิ้ลเอ;
//อธิบายกระแสสำหรับการเขียนข้อมูลลงไฟล์
ของกระแส ฉ;
//เปิดไฟล์ในโหมดเขียน
//โหมดไอโอเอส:: ออกติดตั้งโดยค่าเริ่มต้น
f.open("D:\\game\\noobs.txt", ios::out);
//ใส่จำนวนจำนวนจริง
ศาล<<" n="; ซิน>> n;
//วนซ้ำสำหรับการป้อนจำนวนจริง
//และเขียนลงในไฟล์
สำหรับ (i=0; i
ศาล<<"a=";
//ป้อนตัวเลข
ซิน>>ก;
//ปิดสตรีม
ฉ.ปิด();
ระบบ("หยุดชั่วคราว");
กลับ 0;
_______________________________________________________________
เพื่อที่จะอ่านข้อมูลจากไฟล์ข้อความ คุณจะต้องอธิบายตัวแปรเช่น ถ้าสตรีม- หลังจากนี้คุณจะต้องเปิดไฟล์เพื่ออ่านโดยใช้โอเปอเรเตอร์ เปิด- หากตัวแปรชื่อ F ดังนั้นสองคำสั่งแรกจะเป็นดังนี้:
F.open("D:\\game\\noobs.txt", ios::in);
หลังจากเปิดไฟล์ในโหมดการอ่าน คุณสามารถอ่านข้อมูลจากไฟล์ในลักษณะเดียวกับจากคีย์บอร์ดเท่านั้นซินระบุชื่อของสตรีมที่จะอ่านข้อมูล
ตัวอย่างเช่น หากต้องการอ่านจากสตรีม F ไปยังตัวแปร a คำสั่งอินพุตจะมีลักษณะดังนี้:
ตัวเลขสองตัวในโปรแกรมแก้ไขข้อความจะถือว่าแยกจากกันหากมีอักขระอย่างน้อยหนึ่งตัวอยู่ระหว่างตัวเลข: ช่องว่าง แท็บ จุดสิ้นสุดบรรทัด เป็นการดีถ้าโปรแกรมเมอร์รู้ล่วงหน้าว่าจะเก็บค่าไว้ในไฟล์ข้อความจำนวนเท่าใดและค่าใด อย่างไรก็ตามบ่อยครั้งที่ทราบประเภทของค่าที่เก็บไว้ในไฟล์ แต่จำนวนอาจแตกต่างกันไป เพื่อแก้ปัญหานี้ คุณต้องอ่านค่าจากไฟล์ทีละค่า และก่อนอ่านแต่ละครั้ง ให้ตรวจสอบว่าถึงจุดสิ้นสุดของไฟล์แล้วหรือไม่ มีฟังก์ชั่นสำหรับสิ่งนี้ เอฟ. อีฟ().
โดยที่ F คือชื่อของเธรด ฟังก์ชันจะส่งกลับค่าบูลีน: จริงหรือเท็จ ขึ้นอยู่กับว่าถึงจุดสิ้นสุดของไฟล์หรือไม่ ดังนั้นการวนซ้ำเพื่ออ่านเนื้อหาของไฟล์ทั้งหมดจึงสามารถเขียนได้ดังนี้:
//จัดระเบียบการอ่านค่าจากไฟล์, การดำเนินการ
//การวนซ้ำจะขาดเมื่อเราไปถึงจุดสิ้นสุดของไฟล์
//ในกรณีนี้ F.eof() จะคืนค่าเป็นจริง
ในขณะที่ (!F.eof())
ตัวอย่าง:
ไฟล์ข้อความ D:\\game\\noobs.txt เก็บตัวเลขจริง แสดงบนหน้าจอ และคำนวณตัวเลข
#รวม "stdafx.h"
#รวม
#รวม
#รวม
#รวม
ใช้เนมสเปซมาตรฐาน;
int หลัก()
setlocale(LC_ALL, "มาตุภูมิ");
อินท์n=0;
ลอย;
สตรีม F;
//เปิดไฟล์ในโหมดการอ่าน
F.open("D:\\game\\noobs.txt");
//หากเปิดไฟล์ถูกต้องแล้ว
//วนซ้ำสำหรับอ่านค่าจากไฟล์; การดำเนินการวนซ้ำจะถูกขัดจังหวะ
//เมื่อเราไปถึงจุดสิ้นสุดของไฟล์ ในกรณีนี้ F.eof() จะคืนค่าเป็นจริง
ในขณะที่ (!F.eof())
//อ่านค่าถัดไปจากสตรีม F ไปยังตัวแปร a
ฉ>>ก;
//ส่งออกค่าของตัวแปร a ไปยังหน้าจอ
//เพิ่มจำนวนตัวเลขที่อ่าน
//ปิดสตรีม
F.ปิด();
//กรอกจำนวนตัวเลขที่อ่านบนหน้าจอ
ศาล<<"n="<
//หากเปิดไฟล์ไม่ถูกต้อง แสดงว่าเอาต์พุต
//ข้อความเกี่ยวกับการไม่มีไฟล์ดังกล่าว
อย่างอื่นก็น่าสนใจ<<" Файл не существует"<
ระบบ("หยุดชั่วคราว");
กลับ 0;
ซี++ การประมวลผลไฟล์ไบนารี
เมื่อเขียนข้อมูลลงในไฟล์ไบนารี อักขระและตัวเลขจะถูกเขียนเป็นลำดับไบต์
เพื่อ เขียนลงไปข้อมูลเป็นไฟล์ไบนารี่ คุณต้องมี:
อธิบายตัวแปรไฟล์ประเภท FAIL * โดยใช้ตัวดำเนินการ FILE * ชื่อไฟล์ในที่นี้คือชื่อของตัวแปรที่จะจัดเก็บตัวชี้ไปยังไฟล์
เขียนข้อมูลลงไฟล์โดยใช้ฟังก์ชัน fwrite
เพื่อ นับ b ข้อมูลจากไฟล์ไบนารี คุณต้องการ:
อธิบายตัวแปรประเภท FILE *
เปิดไฟล์โดยใช้ฟังก์ชัน fopen
ปิดไฟล์โดยใช้ฟังก์ชัน fclose
ฟังก์ชันพื้นฐานที่จำเป็นสำหรับการทำงานกับไฟล์ไบนารี
สำหรับ ช่องเปิดไฟล์นี้มีไว้สำหรับฟังก์ชัน fopen
FILE *fopen(const *ชื่อไฟล์, const char *โหมด)
ในที่นี้ชื่อไฟล์คือสตริงที่เก็บชื่อเต็มของไฟล์ที่กำลังเปิด โหมดคือสตริงที่กำหนดโหมดสำหรับการทำงานกับไฟล์ ค่าต่อไปนี้เป็นไปได้:
“ rb” - เปิดไฟล์ไบนารีในโหมดอ่าน
“ wb” - สร้างไฟล์ไบนารีสำหรับการบันทึก หากมีอยู่เนื้อหาจะถูกล้าง
“ab” - สร้างหรือเปิดไฟล์ไบนารี่เพื่อต่อท้ายไฟล์
“rb+” - เปิดไฟล์ไบนารีที่มีอยู่ในโหมดอ่าน-เขียน
“ wb+” - เปิดไฟล์ไบนารีในโหมดอ่าน-เขียน ไฟล์ที่มีอยู่จะถูกล้าง
"ab+" - เปิดหรือสร้างไฟล์ไบนารี่เพื่อแก้ไขข้อมูลที่มีอยู่และเพิ่มข้อมูลใหม่ต่อท้ายไฟล์
ฟังก์ชันคืนค่า NULL ในตัวแปรไฟล์ f หากไฟล์เปิดไม่สำเร็จ หลังจากเปิดไฟล์ ไบต์ที่ 0 จะพร้อมใช้งาน ตัวชี้ไฟล์คือ 0 ซึ่งค่าที่อ่านหรือเขียนจะถูกเลื่อนตามจำนวนไบต์ที่อ่าน (เขียน) ค่าปัจจุบันของตัวชี้ไฟล์คือหมายเลขไบต์ที่การดำเนินการอ่านหรือเขียนจะเกิดขึ้น
สำหรับ ปิดไฟล์นี้มีไว้สำหรับฟังก์ชัน fclose
int fclose(FILE *ชื่อไฟล์);
ส่งคืน 0 หากปิดไฟล์สำเร็จ มิฉะนั้นจะเป็น NULL
ฟังก์ชั่นการลบมีไว้สำหรับ การกำจัดไฟล์.
int ลบ (const char * ชื่อไฟล์);
ฟังก์ชั่นนี้จะลบไฟล์ชื่อ filenema ออกจากดิสก์ ไฟล์ที่จะลบจะต้องถูกปิด ฟังก์ชันจะส่งกลับค่าที่ไม่ใช่ศูนย์หากไม่สามารถลบไฟล์ได้
สำหรับ เปลี่ยนชื่อไฟล์ต่างๆ ฟังก์ชันการเปลี่ยนชื่อมีจุดประสงค์:
int เปลี่ยนชื่อ (const char *oldfilename, const char *newfilename);
พารามิเตอร์แรกคือชื่อไฟล์เก่า พารามิเตอร์ที่สองคือชื่อใหม่ ส่งคืนค่า 0 หากโปรแกรมยุติการทำงานสำเร็จ
การอ่านจากไฟล์ไบนารี่เสร็จสิ้นโดยใช้ฟังก์ชัน fread:
fread(โมฆะ *ptr, ขนาด, n, FILE *ชื่อไฟล์);
ฟังก์ชั่น fread อ่านองค์ประกอบขนาด n จากชื่อไฟล์ไปยังอาร์เรย์ PTR ฟังก์ชันส่งคืนจำนวนองค์ประกอบที่อ่าน หลังจากอ่านจากไฟล์ ตัวชี้จะเลื่อนไปเป็นไบต์ขนาด n*
บันทึกไปยังไฟล์ไบนารี่ทำได้โดยใช้ฟังก์ชัน fwrite:
fwrite(const void *ptr, size, n, FILE *ชื่อไฟล์);
ฟังก์ชั่น fwrite เขียนไปยังชื่อไฟล์จากอาร์เรย์ ptr ขององค์ประกอบขนาด n ฟังก์ชันส่งคืนจำนวนองค์ประกอบที่เขียน หลังจากเขียนข้อมูลลงในไฟล์ ตัวชี้จะเลื่อนไปเป็นไบต์ขนาด n*
สำหรับ การควบคุมการสิ้นสุดไฟล์มีฟังก์ชัน feof:
int feof(FILE *ชื่อไฟล์);
จะส่งกลับค่าที่ไม่ใช่ศูนย์หากถึงจุดสิ้นสุดของไฟล์
ตัวอย่าง:
สร้างไฟล์ไบนารี่ D:\\game\\noobs.dat และเขียนจำนวนเต็ม n และจำนวนจริง n ลงไป
#รวม "stdafx.h"
#รวม
ใช้เนมสเปซมาตรฐาน;
int หลัก()
setlocale(LC_ALL, "มาตุภูมิ");
int n, ฉัน;
ดับเบิ้ลเอ;
//สร้างไฟล์ไบนารี่ในโหมดเขียน
f=fopen("D:\\game\\noobs.dat", "wb");
// ป้อนข้อมูล ตัวเลขn
ศาล<<"n="; cin>>น;
fwrite(&n, ขนาดของ(int), 1, f);
//วนซ้ำเพื่อป้อนจำนวนจริง
สำหรับ (i=0; i
//ป้อนจำนวนจริงถัดไป
ศาล<<"a=";
ซิน>>ก;
//เขียนจำนวนจริงลงในไฟล์ไบนารี่
fwrite(&a, ขนาดของ (สองเท่า), 1, f);
// ปิด ไฟล์
fclose(f);
ระบบ("หยุดชั่วคราว");
กลับ 0;
ตัวอย่าง:
แสดงเนื้อหาของไฟล์ไบนารี D:\\game\\noobs.dat ที่สร้างในงานก่อนหน้า
#รวม "stdafx.h"
#รวม
ใช้เนมสเปซมาตรฐาน;
int หลัก()
setlocale(LC_ALL, "มาตุภูมิ");
int n, ฉัน;
สองเท่า *ก;
ไฟล์ *ฉ; //อธิบายตัวแปรไฟล์
//เปิดไฟล์ไบนารี่ที่มีอยู่ในโหมดอ่าน
//อ่านจำนวนเต็มหนึ่งตัวจากไฟล์ไปยังตัวแปร n
// ส่งออก n ไปที่หน้าจอ
ศาล<<"n="<
//การจัดสรรหน่วยความจำสำหรับอาร์เรย์จำนวน n ตัว
a=ใหม่ สองเท่า[n];
//อ่านจำนวนจริงจากไฟล์ไปยังอาร์เรย์ a
//ส่งออกอาร์เรย์ไปที่หน้าจอ
สำหรับ (i=0; i
ศาล<
// ปิด ไฟล์
fclose(f);
ระบบ("หยุดชั่วคราว");
กลับ 0;
ไฟล์ไบนารี- โครงสร้างข้อมูลตามลำดับ หลังจากเปิดไฟล์ ไบต์แรกที่จัดเก็บไว้ในนั้นจะพร้อมใช้งาน คุณสามารถเขียนหรืออ่านข้อมูลจากไฟล์ตามลำดับได้ สมมติว่าคุณต้องนับเลขสิบห้าแล้วนับเลขตัวแรก การใช้การเข้าถึงตามลำดับสามารถทำได้ด้วยวิธีต่อไปนี้:
int n, ฉัน;
ดับเบิ้ลเอ;
ไฟล์ *ฉ;
f=fopen("D:\\game\\noobs.dat", "rb");
สำหรับ (i=0; i<15; i++)
fclose(f);
f=fopen("D:\\game\\noobs.dat", "rb");
fread(&a, ขนาดของ (สองเท่า), 1, f);
fclose(f);
อย่างที่คุณเห็น การอ่านตัวเลขจากไฟล์แล้วเปิดไฟล์อีกครั้งไม่ใช่วิธีที่สะดวกที่สุด การใช้ฟังก์ชัน fseek จะสะดวกกว่ามากเพื่อย้ายตัวชี้ไฟล์ไปยังไบต์ที่กำหนด
int fseek(FILE *ชื่อไฟล์, int offset แบบยาว, int origin);
ฟังก์ชันนี้จะตั้งค่าตัวชี้ตำแหน่งไฟล์ปัจจุบัน F ตามค่ากำเนิดและค่าออฟเซ็ต พารามิเตอร์ออฟเซ็ตจะเท่ากับจำนวนไบต์ที่ตัวชี้ไฟล์จะถูกออฟเซ็ตโดยสัมพันธ์กับจุดเริ่มต้นที่ระบุโดยพารามิเตอร์ต้นกำเนิด ค่าสำหรับพารามิเตอร์ต้นกำเนิดจะต้องเป็นหนึ่งในค่าออฟเซ็ตต่อไปนี้ซึ่งกำหนดไว้ในส่วนหัว stdio.h:
SEEK_SET - จากจุดเริ่มต้นของไฟล์
SEEK_CUR - จากตำแหน่งปัจจุบัน
SEEK_END - จากท้ายไฟล์
ฟังก์ชันจะส่งกลับค่าศูนย์หากการดำเนินการสำเร็จ และจะส่งกลับค่าที่ไม่ใช่ศูนย์หากออฟเซ็ตล้มเหลว
ฟังก์ชัน fseek ใช้การเข้าถึงโดยตรงไปยังค่าใดๆ ในไฟล์ คุณจะต้องทราบตำแหน่ง (หมายเลขไบต์) ของค่าในไฟล์เท่านั้น ลองดูที่การใช้การเข้าถึงโดยตรงในไฟล์ไบนารีโดยใช้ปัญหาต่อไปนี้เป็นตัวอย่าง
ตัวอย่าง
ในไฟล์ไบนารี่ D:\\game\\noobs.dat ที่สร้างไว้ก่อนหน้านี้ ให้สลับจำนวนจริงที่ใหญ่ที่สุดและเล็กที่สุด
อัลกอริทึมสำหรับการแก้ปัญหาประกอบด้วยขั้นตอนต่อไปนี้:
อ่านค่าจริงจากไฟล์ลงในอาร์เรย์ a
ค้นหาในอาร์เรย์ a เพื่อดูค่าสูงสุด (สูงสุด) และต่ำสุด (นาที) และตัวเลข (imax, imin)
ย้ายตัวชี้ไฟล์ไปที่ค่าสูงสุดและเขียนขั้นต่ำ
ย้ายตัวชี้ไฟล์ไปที่ค่าต่ำสุดและเขียนค่าสูงสุด
ด้านล่างนี้เป็นข้อความของโปรแกรมสำหรับแก้ไขปัญหาพร้อมความคิดเห็น
#รวม "stdafx.h"
#รวม
ใช้เนมสเปซมาตรฐาน;
int หลัก()
setlocale(LC_ALL, "มาตุภูมิ");
int n, i, imax, imin;
สองเท่า *a, สูงสุด, นาที;
ไฟล์ *ฉ;
//เปิดไฟล์ในโหมดอ่าน-เขียน
f=fopen("D:\\game\\noobs.dat", "rb+");
//อ่านตัวเลขจากไฟล์ไปเป็นตัวแปร n
//จำนวนจริงในไฟล์
fread(&n, ขนาดของ(int), 1, f);
ศาล<<"n="<
//จัดสรรหน่วยความจำสำหรับเก็บจำนวนจริง
//ซึ่งจะถูกเก็บไว้ในอาร์เรย์ a
a=ใหม่ สองเท่า[n];
//อ่านจากไฟล์ไปยังอาเรย์และจำนวนจริง
fread(a, ขนาดของ(สองเท่า), n, f);
//ค้นหาองค์ประกอบสูงสุดและต่ำสุด
// ในอาร์เรย์ a และดัชนีของพวกเขา
สำหรับ (imax=imin=0, สูงสุด=นาที=a, i=1; i
ถ้า (a[i]>สูงสุด)
สูงสุด=a[i];
ถ้า (เป็น[i]
นาที=a[i];
// การย้าย ตัวชี้ ถึง สูงสุด องค์ประกอบ
fseek(f, ขนาดของ(int)+imax*ขนาดของ(สองเท่า), SEEK_SET);
//เขียน min แทนองค์ประกอบไฟล์สูงสุด
fwrite(&min, ขนาดของ (สองเท่า), 1, f);
// การย้าย ตัวชี้ ถึง ขั้นต่ำ องค์ประกอบ
fseek(f, ขนาดของ(int)+imin*ขนาดของ(สองเท่า), SEEK_SET);
//เขียนสูงสุดแทนองค์ประกอบไฟล์ขั้นต่ำ
fwrite(&max, sizeof(double), 1, f);
//ปิดไฟล์
fclose(f);
//เพิ่มหน่วยความจำ
ลบ [ ]ก;
ระบบ("หยุดชั่วคราว");