Input/output with files
ในบทสุดท้ายของบทเรียนภาษา C++ นี้ คุณจะได้เรียนการดำเนินการพื้นฐานกับไฟล์ โดยเราสามารถที่อ่านและเขียนบางอย่างลงไปใน text ไฟล์ fstream
เป็นไลบรารีมาตรฐานที่ช่วยให้เราสามารถดำเนินการบางอย่างกับไฟล์ โดยจะมี 3 steam classes ในไลบรารี่ที่แสดงในรายการข้างล่างนี้
ofstream
: Stream class เพื่อเขียนข้อมูลลงไฟล์ifstream
: Stream class เพื่ออ่านข้อมูลจากไฟล์fstream
: Stream class เพื่ออ่านข้อมูลและเขียนข้อมูลกับไฟล์
อย่างไรก็ตาม ในบทนี้เราจะทำงานกับแค่ Text ไฟล์เท่านั้น
การเปิดไฟล์
สิ่งแรกที่คุณจะต้องทำก่อนที่จะทำบางอย่างกับไฟล์คือการเปิดไฟล์ เราสามารถเลือกใช้จากหนึ่งของสามคลาสที่เหมาะสมกับสิ่งที่เราต้องการจะทำได้ เพื่อที่จะเขียนหรืออ่าน และฟังก์ชันที่ใช้ในการเปิดไฟล์คือ open()
นี่เป็นรูปแบบของการใช้งานฟังก์ชัน
open(path, mode);
ในการใช้งานฟังก์ชัน open()
มีโหมดต่างๆ สำหรับการเปิดไฟล์ที่ใช้งาน ข้างล่างนี้เป็นตารางของโหมดต่างๆ ในการเปิดไฟล์ด้วยฟังก์ชัน
โหมด | คำอธิบาย |
---|---|
ios::in | เปิดไฟล์สำหรับการอ่านข้อมูลจากไฟล์ |
ios::out | เปิดไฟล์สำหรับการเขียนข้อมูลลงไปในไฟล์ |
ios::binary | โหมดไฟล์สำหรับการทำงานในโหมด binary |
ios::ate | เปิดไฟล์และกำหนดให้ไฟล์ pointer ชี้ไปยังส่วนท้ายของไฟล์ ถ้าหากเราไม่กำหนด flag นี้จะชี้ไปที่จุดเริ่มต้นแทน |
ios::app | เปิดไฟล์สำหรับการเขียนข้อมูลลงไปต่อท้ายของไฟล์ |
ios::trunc | ถ้าหากไฟล์ถูกเปิดสำหรับใหม่เขียนลงไปในไฟล์และมีไฟล์อยู่ โปรแกรมจะทำการลบไฟล์และสร้างใหม่ |
สำหรับการเปิดไฟล์ด้วย Stream object แต่ละแบบในภาษา C++ นั้นมีโหมดพื้นฐาดังนี้
คลาส | Default โหมดเมื่อสร้างออบเจ็ค |
---|---|
ofstream | ios::out |
ifstream | ios::in |
fstream | ios::in | ios::out |
มาดูตัวอย่างการเปิดไฟล์ในแบบต่างๆ
// open for write
ofstream myfile1;
myfile1.open("example1.txt");
// open file for read
ifstream myfile2;
myfile2.open("example2.txt");
// open file for read and write
ofstream myfile3;
myfile3.open("example3.txt");
// open file for write and appending
ofstream myfile4;
myfile4.open("example4.txt", std::ios::out | std::ios::app);
ในตัวอย่าง ตัวแปร myfile1
เป็นการเปิดไฟล์สำหรับการเขียน ตัวแปร myfile2
เป็นการเปิดไฟล์สำหรับการอ่าน และตัวแปร myfile3
เป็นการเปิดไฟล์สำหรับการกระทำทั้งสองอย่างในเวลาเดียวกัน และสุดท้ายตัวแปร myfile4
เป็นการเปิดไฟล์สำหรับการเขียนและเขียนต่อท้ายโดยการกำหนดโหมด
Closing a file
หลังจากเราเสร็จงานของเราแล้ว เราต้องผิดไฟล์โดยการใช้ฟังก์ชัน close()
myfile1.close();
myfile2.close();
myfile3.close();
การเขียนข้อมูลลงไฟล์ (text files)
เราสามารถเขียนตัวอักษร ข้อความหรือตัวเลข ลงไปในไฟล์โดยการใช้เครื่องหมาย <<
กับไฟล์ที่เราต้องการจะเขียนไปยัง
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream myfile;
myfile.open ("example.txt");
myfile << "This is the first line.\n";
myfile << "The second line.\n";
myfile << 10.5;
myfile.close();
return 0;
}
ในตัวอย่าง เราได้เปิดไฟล์ example.txt
และเขียนข้อความลงไปสองบรรทัด และตัวเลขอีกหนึ่งบรรทัด และปิดไฟล์หลังจากที่เขียนเสร็จแล้ว เมื่อคุณเปิดดูไฟล์ example.txt
สิ่งที่คุณเห็นในไฟล์ควรจะเป็นแบบนี้
This is the first line.
The second line.
10.5
การอ่านข้อมูลจากไฟล์ (text files)
หลังจากที่เขียนข้อมูลลงไปในไฟล์แล้วต่อไป เราจะมาอ่านเนื้อหาจากไฟล์ที่เราได้เพิ่งเขียนลงไปด้วย file stream ifstream
นี่เป็นตัวอย่างของโปรแกรมในการอ่านข้อมูลจากไฟล์ในภาษา C++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream myfile;
string line;
myfile.open ("example.txt");
while (getline(myfile,line))
{
cout << line << '\n';
}
myfile.close();
return 0;
}
ในตัวอย่าง เราใช้คำสั่ง while
loop วนรอบเพื่ออ่านข้อมูลจากไฟล์ทีละบรรทัด ฟังก์ชัน getline()
เป็นฟังก์ชันของ string ที่ช่วยให้เราสามารถอ่านข้อมูลมาทีละบรรทัดและใส่ไว้ในตัวแปร line
และฟังก์ชัน getline()
จะไม่อ่านการขึ้นบรรทัดใหม่ (\n
) ในไฟล์มาด้วย มันจะวนซ้ำจนกว่าจะอ่านไปจนสิ้นสุดบรรทัดสุดท้ายของไฟล์
This is the first line.
The second line.
10.5
นี่เป็นผลลัพธ์การทำงานของโปรแกรมที่เราได้อ่านจากไฟล์ example.txt
การเขียนไฟล์ต่อท้าย (File appending)
ในตัวอย่างก่อนหนัาเป็นการเขียนข้อมูลลงใน Text file แบบปกติ ซึ่งโดยปกติแล้วเมื่อเราไม่ได้ใส่ตัวเลือกการเปิดไฟล์ในพารามิเตอร์ที่สองของฟังก์ชัน open()
ในบางครั้งโปรแกรมของเราก็อยากที่จะเขียนโปรแกรมต่อท้ายไฟล์เดิม เพื่อรักษาข้อมูลเดิมของเรา ในภาษา C++ นั้นเราจะใช้ Option std::fstream::app
สำหรับการเขียนข้อมูลต่อท้ายไฟล์เดิม นี่เป็นตัวอย่างของโปรแกรม
#include <fstream>
int main()
{
std::fstream myfile;
myfile.open("example.txt",
std::ios::in | std::ios::out | std::ios::app);
myfile << "\nappend new text to the file.\n";
myfile << "marcuscode.com\n";
myfile.close();
return 0;
}
ในตัวอย่าง เป็นโปรแกรมในการเขียนข้อมูลต่อท้ายไฟล์เดิม ในตอนแรกเราสร้างตัวไฟล์ stream จากคลาส fstream
ซึ่งในคลาสนี้ทำให้ตัวแปรไฟล์สามารถที่จะอ่านหรือเขียนได้ในเวลาเดียวกัน โดยการใส่ Option ในการเปิด
myfile.open ("example.txt", std::ios::in | std::ios::out | std::ios::app);
ในฟังก์ชัน open()
เราได้เปิดไฟลฺ์และใส่พารามิเตอร์ตัวที่สอง ซึ่งเป็นตัวเลือกในการเปิดไฟล์สำหรับอ่าน เขียน และต่อท้าย และหลังจากนั้นเราเขียนข้อมูลอีกสองบรรทัดลงไปในไฟล์ของเรา และเมื่อรันโปรแกรมจะปรากฎข้อความสองบรรทัดดังกล่าวต่อที่ท้ายของไฟล์
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับไฟล์ในภาษา C++ เราได้แสดงให้เห็นถึงตัวอย่างของการเปิดไฟล์เพื่ออ่านและเขียน และการเปิดไฟล์สำหรับการเขียนต่อท้ายโดยการใช้ File stream อย่างไรก็ตามในการทำงานกับไฟล์นั้นเราควรคำนึงถึงข้อผิดพลาดที่อาจจะเกิดขึ้น ซึ่งเราสามารถจัดการได้โดยใช้ Exception