C ++ ไฟล์และลำธาร
จนถึงขณะนี้เราได้ใช้ห้องสมุดiostream มาตรฐานซึ่งมี CINและวิธีการสตรีมศาลจะใช้ในการอ่านจากอินพุตมาตรฐานและเขียนไปยังกระแสออกมาตรฐาน
กวดวิชานี้จะแสดงวิธีการอ่านและเขียนไฟล์จากกระแสการสตรีมไฟล์ นั่นคือสิ่งที่อีก c ++ มาตรฐานห้องสมุดfstream จะกำหนดสามประเภทข้อมูลใหม่:
数据类型 | 描述 |
---|---|
ofstream | 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 该数据类型表示输入文件流,用于从文件读取信息。 |
fstream | 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。 |
หากต้องการยื่นจัดการใน C ++ คุณต้องรวมไฟล์ส่วนหัวใน C ++ ไฟล์โค้ด <iostream> และ <fstream>
เปิดแฟ้ม
ก่อนที่จะอ่านข้อมูลจากไฟล์หรือเขียนไฟล์ก่อนอื่นคุณต้องเปิดแฟ้มofstream และ fstreamวัตถุสามารถใช้ในการเปิดไฟล์สำหรับการเขียนถ้าคุณจะต้องเปิดไฟล์สำหรับการอ่านใช้วัตถุifstream
นี่คือเปิด () ฟังก์ชันไวยากรณ์มาตรฐานเปิด () ฟังก์ชั่นนี้เป็นสมาชิกของ fstream, ifstream และ ofstream วัตถุ
void open(const char *filename, ios::openmode mode);
ที่นี่เปิด () ฟังก์ชันสมาชิกของพารามิเตอร์แรกที่ระบุชื่อและที่ตั้งของไฟล์ที่คุณต้องการที่จะเปิดและพารามิเตอร์ที่สองกำหนดไฟล์จะถูกเปิดโหมด
模式标志 | 描述 |
---|---|
ios::app | 追加模式。所有写入都追加到文件末尾。 |
ios::ate | 文件打开后定位到文件末尾。 |
ios::in | 打开文件用于读取。 |
ios::out | 打开文件用于写入。 |
ios::trunc | 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。 |
คุณสามารถใช้การรวมกันของสองคนหรือมากกว่าของโหมดดังกล่าวข้างต้น ตัวอย่างเช่นถ้าคุณต้องการที่จะเปิดไฟล์ในโหมดการเขียนและต้องการที่จะตัดไฟล์เพื่อป้องกันไฟล์ที่มีอยู่แล้วคุณสามารถใช้ไวยากรณ์ต่อไปนี้:
ofstream outfile; outfile.open("file.dat", ios::out | ios::trunc );
ในทำนองเดียวกันคุณถ้าคุณต้องการที่จะเปิดไฟล์สำหรับการอ่านและการเขียนคุณสามารถใช้ไวยากรณ์ต่อไปนี้:
fstream afile; afile.open("file.dat", ios::out | ios::in );
ปิดแฟ้ม
เมื่อโปรแกรม C ++ ยุติก็จะปิดโดยอัตโนมัติรีเฟรชลำธารปล่อยจัดสรรหน่วยความจำทั้งหมดและปิดไฟล์ที่เปิดอยู่ทั้งหมด แต่โปรแกรมเมอร์ควรพัฒนานิสัยที่ดีก่อนที่โปรแกรมจะยุติปิดไฟล์ที่เปิดอยู่ทั้งหมด
นี่คือใกล้ () ฟังก์ชันไวยากรณ์มาตรฐานใกล้ () ฟังก์ชั่นนี้เป็นสมาชิกของ fstream, ifstream และ ofstream วัตถุ
void close();
เขียนไปยังแฟ้ม
ในการเขียนโปรแกรมภาษา C ++ เราจะใช้ผู้ประกอบการสตรีมแทรก (<<) ในการเขียนข้อมูลไปยังแฟ้มเช่นเดียวโดยใช้ข้อมูลที่ส่งออกไปยังผู้ประกอบการบนหน้าจอเดียวกัน แต่ที่แตกต่างก็คือว่าที่นี่คุณกำลังใช้ofstream หรือวัตถุ fstreamแทนของวัตถุศาล
อ่านไฟล์
ในการเขียนโปรแกรมภาษา C ++ เราจะใช้ดำเนินการแยกสตรีม (>>) เพื่ออ่านข้อมูลจากไฟล์เช่นเดียวกับการใช้ข้อมูลของท่านผู้ประกอบการจากแป้นพิมพ์ แต่ที่แตกต่างก็คือว่าที่นี่คุณกำลังใช้fstream ifstreamหรือวัตถุแทนของวัตถุCIN
อ่านและการเขียนตัวอย่าง
ต่อไปนี้โปรแกรม C ++ เพื่อเปิดไฟล์ในโหมดอ่านการเขียน หลังจากเขียนไปยังแฟ้มข้อมูล afile.dat ป้อนโดยผู้ใช้โปรแกรมอ่านข้อมูลจากไฟล์และส่งออกไปยังหน้าจอ:
#include <fstream> #include <iostream> using namespace std; int main () { char data[100]; // 以写模式打开文件 ofstream outfile; outfile.open("afile.dat"); cout << "Writing to the file" << endl; cout << "Enter your name: "; cin.getline(data, 100); // 向文件写入用户输入的数据 outfile << data << endl; cout << "Enter your age: "; cin >> data; cin.ignore(); // 再次向文件写入用户输入的数据 outfile << data << endl; // 关闭打开的文件 outfile.close(); // 以读模式打开文件 ifstream infile; infile.open("afile.dat"); cout << "Reading from the file" << endl; infile >> data; // 在屏幕上写入数据 cout << data << endl; // 再次从文件读取数据,并显示它 infile >> data; cout << data << endl; // 关闭打开的文件 infile.close(); return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการจะผลิตปัจจัยการผลิตต่อไปนี้และเอาท์พุท:
$./a.out Writing to the file Enter your name: Zara Enter your age: 9 Reading from the file Zara 9
ตัวอย่างข้างต้นใช้ฟังก์ชันวัตถุ CIN เพิ่มเติมเช่น getline () ฟังก์ชันอ่านบรรทัดจากภายนอกไม่สนใจ () ฟังก์ชันจะอ่านคำสั่งก่อนที่จะออกจากตัวละครพิเศษจะถูกละเว้น
ตัวชี้ตำแหน่งของไฟล์
istream และ ostreamให้ฟังก์ชั่นสำหรับสมาชิกตำแหน่งตำแหน่งของไฟล์ตัวชี้ เหล่านี้รวมถึงฟังก์ชั่นเกี่ยวกับสมาชิกของ istreamseekg ( "ขอได้รับ") และใน seekpostream( "การแสวงหาใส่")
seekp seekg และอาร์กิวเมนต์มักจะเป็นจำนวนเต็มยาว พารามิเตอร์ที่สองสามารถใช้ในการกำหนดทิศทางของการค้นหา หาทิศทางสามารถiOS :: Beg (ค่าเริ่มต้นตำแหน่งจากจุดเริ่มต้นของสตรีม) ก็สามารถเป็น iOS :: CUR (ตำแหน่งจากตำแหน่งปัจจุบันของกระแส)ก็สามารถเป็นiOS :: จบ (จากจุดสิ้นสุดของกระแสจะเริ่มต้นการวางตำแหน่ง)
ตัวชี้ตำแหน่งของไฟล์เป็นค่าจำนวนเต็มที่ระบุจำนวนไบต์จากจุดเริ่มต้นของไฟล์ไปยังตำแหน่งของตัวชี้ นี่เป็นเป้าหมาย "รับ" อินสแตนซ์ชี้ตำแหน่งของไฟล์:
// 定位到 fileObject 的第 n 个字节(假设是 ios::beg) fileObject.seekg( n ); // 把文件的读指针从 fileObject 当前位置向后移 n 个字节 fileObject.seekg( n, ios::cur ); // 把文件的读指针从 fileObject 末尾往回移 n 个字节 fileObject.seekg( n, ios::end ); // 定位到 fileObject 的末尾 fileObject.seekg( 0, ios::end );