Input/output with files

27 June 2015

ในบทสุดท้ายของบทเรียนนี้ เราจะเรียนรู้เกี่ยวกับไฟล์ในภาษา C เช่น การเปิดไฟล์ การอ่านข้อมูลจากไฟล์ และการเขียนข้อมูลลงไปบนไฟล์ ทั้ง text file และ binary file

การเปิดไฟล์

ในการทำงานร่วมกับไฟล์สิ่งแรกที่จะต้องทำคือเปิดไฟล์ขึ้นมาก่อน โดยการใช้ฟังก์ชัน fopen() ในการเปิดไฟลฺ์ โดยมีรูปแบบการใช้งานดังนี้

fopen(filename, mode);

โดยฟังก์ชันนี้จะมีพารามิเตอร์สองตัว คือ filename เป็นชื่อหรือพาท์ธของไฟล์ และ mode เป็นโหมดสำหรับการเปิดไฟล์ โดยโหมดของการเปิดไฟล์ในภาษา C จะมีดังนี้

โหมดคำอธิบาย
rเปิดไฟล์เพื่ออ่าน
wเปิดไฟล์เพื่อเขียน
aเปิดไฟล์สำหรับการเขียนต่อท้าย
r+เปิดไฟล์เพื่อทั้งอ่านและเขียน
w+เปิดไฟล์เพื่ออ่านและเขียนและลบข้อมูลของไฟล์ในตอนเริ่มต้น
a+เปิดไฟล์เพื่ออ่านและเขียนต่อท้ายไฟล์

จากตารางข้างบนเป็นการเปิดไฟล์สำหรับ text file และถ้าคุณทำงานกับ binary file คุณต้องใช้โหมดเหล่านี้แทน

โหมดคำอธิบาย
rbเปิดไฟล์เพื่ออ่าน
wbเปิดไฟล์เพื่อเขียน
abเปิดไฟล์สำหรับการเขียนต่อท้าย
rb+เปิดไฟล์เพื่อทั้งอ่านและเขียน
wb+เปิดไฟล์เพื่ออ่านและเขียนและลบข้อมูลของไฟล์ในตอนเริ่มต้น
ab+เปิดไฟล์เพื่ออ่านและเขียนต่อท้ายไฟล์

การปิดไฟล์

หลังจากเสร็จสิ้นการใช้งานไฟล์แล้วเราจำเป็นต้องปิดไฟล์เพื่อให้ระบบนำไฟล์ไปใช้อย่างอื่นได้ต่อไป สำหรับการปิดไฟล์ในภาษา C นั้นเราจะใช้ฟังก์ชัน fclose() โดยการส่งตัวแปรไฟล์มราต้องการปิดไป หากสำเร็จฟังก์ชันจะส่งค่า 0 หากไม่จะส่งค่า EOF มันรูปแบบการใช้คือ;

fclose(file);

การเขียนลงบนไฟล์

ในการเขียนข้อมูลลงบน text file คุณสามารถใช้ฟังก์ชันต่างๆ ได้ในภาษา C โดยทั่วไปแล้วจะมี 3 ฟังก์ชันที่เราจะใช้ คือ

  • fputc() ใช้สำหรับเขียนตัวอักษรลงไปบนไฟล์
  • fputs() ใช้สำหรับเขียนข้อความที่เป็น string ลงไปบนไฟล์
  • fprintf() ใช้สำหรับเขียนข้อความที่เป็น string ลงไปบนไฟล์เช่นกัน แต่สามารถจัดรูปแบบการเขียนได้

ต่อไปมาดูตัวอย่างการเขียนข้อความลงไปบน text file ในภาษา C

#include <stdio.h>

int main()
{
    FILE *fp;

    fp = fopen("example.txt", "w");
    fputs("The first line of writing to the text file.\n", fp);
    fputs("The second line.\n", fp);
    fprintf(fp, "The third line with number %f.\n", 5.43);
    fclose(fp);
    return 0;
}

ในตัวอย่าง เราได้ทำการเขียนไฟล์ลงไปบนไฟล์ example.txtในตอนแรกเราสร้างตัวแปรไฟล์ขึ้นมาโดยการใช้คำสั่ง FILE *fp โดยเราเรียกตัวแปรนี้ว่า file pointer ซึ่งตัวแปรจะชี้ไปยังตำแหน่งเริ่มต้นของไฟล์เมื่อมันถูกสร้าง และเราได้เปิดไฟล์เพื่อเขียนเราใช้โหมดการเปิดเป็น w ต่อมาเริ่มทำการเขียนข้อความลงไปบนไฟล์โดยการใช้ฟังก์ชัน fputs() และ fprintf() สำหรับฟังก์ชัน fprintf() เราได้จัดรูปแบบของการแสดงผลในตัวเลข มันทำงานคล้ายกับฟังก์ชัน printf() แต่ลงไปบนไฟล์แทน ในตอนท้ายเราปิดไฟล์หลังจากที่เขียนเสร็จสิ้นด้วยฟังก์ชัน fclose()

และนี่เป็นผลลัพธ์บนไฟล์ example.txt หลังจากการเขียน

The first line of writing to the text file.
The second line.
The third line with number 5.430000.

การอ่านจากไฟล์

ในการอ่านข้อมูลจาก text file คุณสามารถใช้ฟังก์ชันต่างๆ ได้ในภาษา C ซึ่งจะมี 3 ฟังก์ชัน คือ

  • fgetc() ใช้สำหรับอ่านข้อมูลหนึ่งตัวอักษรจากไฟล์
  • fgets() ใช้สำหรับการอ่านข้อความเป็นบรรทัดจากไฟล์
  • fscanf() ใช้สำหรับการอ่านข้อความโดยสิ้นสุดที่ space bar หรือ new line

ต่อไปมาดูตัวอย่างการอ่านข้อความจากไฟล์ในภาษา C โดยเราจะใช้ไฟล์จากตัวอย่างการหน้าคือ example.txt

#include <stdio.h>

int main()
{
    FILE *fp;

    fp = fopen("example.txt", "r");
    char buffer[255];

    fgets(buffer, 255, fp);
    printf("%s", buffer);

    fgets(buffer, 255, fp);
    printf("%s", buffer );

    fscanf(fp, "%s", buffer);
    printf("%s\n", buffer);

    fscanf(fp, "%s", buffer);
    printf("%s\n", buffer);

    fclose(fp);
    return 0;
}

ในตัวอย่างเป็นการอ่านข้อมูลจาก text file example.txt ที่เราได้เพิ่งเขียนลงไปในตัวอย่างก่อนหน้า ในการเปิดไฟล์เราใช้โหมด r สำหรับการอ่าน และเราประกาศตัวแปร buffer สำหรับใช้พักข้อมูลที่อ่านมาจากไฟล์ โดยขนาดของมันต้องเพียงพอกับการอ่านใน 1 ครั้ง ต่อไปเราได้ใช้ฟังก์ชัน fputs ในการอ่าน โดยใส่พารามิเตอร์ 3 ตัว ตัวแรกเป็นตัวแปร buffer อันที่สองเป็นขนาดที่ต้องการอ่านคือ 255 จากตัวอย่าง มันควรจะน้อยกว่าหรือเท่ากับขนาดของตัวแปร buffer เสมอ อันที่สามเป็นตัวแปร file pointer ของเรา ต่อมาเราใช้ฟังก์ชัน fscanf() เพื่ออ่าน โดยมันจะอ่านโดยการใช้ space bar หรือ new line เพื่อสิ้นสุดการอ่าน ซึ่งมันทำงานคล้ายกับฟังก์ชัน scanf()

และนี่เป็นผลลัพธ์ของโปรแกรมสำหรับการอ่านไฟล์

The first line of writing to the text file.
The second line.
The
third

ฺทำงานกับ Binary file

ฺBinary file คือไฟล์ที่คอมพิวเตอร์สามารถอ่านเข้าใจและมนุษย์ไม่เข้าใจได้ รูปแบบของการเก็บข้อมูลของ Binary file นั้นเป็นการเก็บแบบตัวเลขฐานสองที่ประกอบไปด้วยลำดับของตัวเลข 1 และ 0 ซึ่งแตกต่างจาก Text file ที่เก็บข้อมูลในรูปแบบ ASCII ซึ่งมนุษย์สามารถเข้าใจได้ มาดูตัวอย่างการทำงานกับ Binary file ในภาษา C

#include <stdio.h>

struct point
{
    int x;
    int y;
    int z;
};

int main()
{
    int i;
    FILE *myfile;
    struct point p;

    // Writing to binary file
    myfile = fopen("point", "w");
    if (!myfile) {
        printf("Could not open file to write.");
        return 1;
    }

    for (i = 0; i < 10; i++)
    {
        p.x = (i + 1);
        p.y = (i + 1) * 10;
        p.z = (i + 1) * 100;
        fwrite(&p, sizeof(struct point), 1, myfile);
    }
    fclose(myfile);

    // Reading from binary file
    myfile = fopen("point", "r");
    if (!myfile) {
        printf("Could not open file to write.");
        return 1;
    }

    for (i = 0; i < 10; i++)
    {
        fread(&p, sizeof(struct point), 1, myfile);
        printf("%d %d %d\n", p.x, p.y, p.z);
    }
    fclose(myfile);

    return 0;
}

ในตัวอย่าง เป็นโปรแกรมเขียนข้อมูลลงใน Binary file ไฟล์หลังจากนั้นเราจะอ่านข้อมูลจากไฟล์ดังกล่าวเพื่อมาแสดงผลทางหน้าจอ ในการทำงานกับ Binary file เราใช้คำสั่ง FILE สำหรับสร้างตัวแปร file pointer เราจะทำการเขียนข้อมูลแบบออบเจ็คลงในไฟล์ที่สร้างจาก struct point

การเขียนข้อมูลใน Binary file

หลังจากที่เราได้สร้างตัวแปร File pointer แล้ว เราทำการเปิดไฟล์ด้วยฟังก์ชัน fopen() โดยมีโหมดของการเปิดไฟล์เป็น w โปรแกรมจะทำการสร้างไฟล์ใหม่หากไฟล์ไม่มีอยู่ และหากมีอยู่จะลบไฟล์เดิมทิ้งแล้วสร้างขึ้นมาใหม่ หลังจากที่เปิดไฟล์แล้ว เราทำการตรวจสอบตัวแปร File pointer ว่าการเปิดสำเร็จหรือไม่ ถ้าหากไม่สำเร็จจะจบการทำงานของโปรแกรมด้วยคำสั่ง return 1

// Writing to binary file
myfile = fopen("point", "w");
if (!myfile) {
    printf("Could not open file to write.");
    return 1;
}

หลังจากการเปิดไฟล์เสร็จเรียบร้อย เราเขียนข้อมูลจาก struct point ลงไปในไฟล์ด้วยฟังก์ชัน fwrite() เป็นจำนวน 10 ครั้ง โดยฟังก์ชันมี 4 พารามิเตอร์คือ ตัวแรกเป็นตำแหน่งที่อยู่ของข้อมูลใน struct และพารามิเตอร์ตัวที่สองเป็นขนาดของ struct พารามิเตอร์ตัวที่สามเป็นจำนวนของออบเจ็คที่เขียนลงไป ในตัวอย่างเราเขียนลงทีละ 1 และสุดท้ายเป็นไฟล์ pointer

for (i = 0; i < 10; i++)
{
    p.x = (i + 1);
    p.y = (i + 1) * 10;
    p.z = (i + 1) * 100;
    fwrite(&p, sizeof(struct point), 1, myfile);
}

เราปิดไฟล์หลังจากการเขียนข้อมูลเสร็จสิ้น

fclose(myfile);

การอ่านข้อมูลจาก Binary file

หลังจากที่เขียนข้อมูลลงไปใน Binary file เรียบร้อยแล้ว ต่อไปเป็นการอ่านข้อมูลจากไฟล์ดังกล่าว เราได้เปิดไฟล์ด้วยโหมด r และตรวจสอบการเปิดไฟล์เช่นเดิม และวนอ่านข้อมูลจากไฟล์ 10 ครั้ง เข้ามายัง struct point ด้วยฟังก์ชัน fread() ที่มี 4 พารามิเตอร์เช่นกัน แต่ในตอนอ่านจะเป็นการนำข้อมูลจากไฟล์มาใส่ในตัวแปร struct p แทน

for (i = 0; i < 10; i++)
{
    fread(&p, sizeof(struct point), 1, myfile);
    printf("%d %d %d\n", p.x, p.y, p.z);
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรมในการเขียนข้อมูลและอ่านข้อมูลกับ Binary ไฟล์

1 10 100
2 20 200
3 30 300
4 40 400
5 50 500
6 60 600
7 70 700
8 80 800
9 90 900
10 100 1000

ในบทเรียนนี้เราได้ครอบคลุมพื้นฐานเกี่ยวกับไฟล์ในภาษา C เราได้ให้คุณเห็นถึงตัวอย่างการทำงานกับ text file และ binary file

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