Input/output with files

8 September 2015

ในบทสุดท้ายของบทเรียนภาษา 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 โหมดเมื่อสร้างออบเจ็ค
ofstreamios::out
ifstreamios::in
fstreamios::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

บทความนี้เป็นประโยชน์หรือไม่?Yes·No