ในบทนี้ จะกล่าวเกี่ยวกับเรื่องการจัดการไฟล์และไดเร็กทอรี่โดยเฉพาะ ซึ่งได้จัดให้เป็นบทๆ หนึ่งที่ไม่รวมกับเรื่องอื่นก็เพราะว่า การจัดการไฟล์ประเภทต่างๆ เช่น การเปิดไฟล์ เขียนข้อมูลลงไฟล์ เป็นสิ่งที่เราต้องศึกษาเอาไว้ให้ดี และที่สำคัญที่สุด ก็คือ การทำงานร่วมกับอินเตอร์เฟสในระบบวินโดว์ เช่น เมื่อเปิดไฟลืขึ้นมาแล้วจะนำข้อมูลมาแสดงในเท็กซ์บ็อกซ์อย่างไร หรือจะนำข้อมูลมาเรียงในลิสต์บ็อกซ์อย่างไร
ในบทเรียนนี้จะได้รู้จักกับเทคนิคและวิธีการจัดการไฟล์แบบต่างๆ โดยใช้ Standard Library รวมทั้งการใช้คลาสจาก MFC ด้วยเนื้อหาในบท มีดังนี้
-การจัดการ Text File โดยใช้คลาสจาก MFC
- การทำงานร่วมกับอุปกรณ์ของวินโดวส์
การจักการ Text File โดยใช้คลาสจาก MFC
คลาสที่ใช้สำหรับจัดการไฟล์ใน MFC ที่จะนำใช้มีอยู่ 2 คลาส คือ
1.คลาส CFile เป็นคลาสแม่ของคลาสที่ใช้ในการจัดการไฟล์ทั้งหมดของ MFC
2.คลาส CStdioFile สืบทอดจาก CFile ใช้สำหรับจัดการเท็กซ์ไฟล์โดยเฉพาะ
การใช้งานคลาส CStdioFileบอกได้ว่าการเรียกฟังก์ชันจากคลาสที่ตรงไปตรงมาสามารถเขียนข้อมูลในรูปของคลาส CString และอ่านข้อมูลมาเก็บอยู่ในรูปของคลาส CString ได้
รายละเอียด แบะฟังก์ชันที่เป็นสมาชิกของาคลาส CStdioFile มีดังนี้
M_pStream เป็นตัวแปรพอยน์เตอร์ที่จะชี้ตำแหน่งปัจจุบันของไฟล์
CstdioFile( ) เป็นฟังก์ชันคอนสตรักเตอร์ของคลาส CStdioFile
ReadString( ) อ่านข้อมูลจากไฟล์
WriteString( ) เขียนข้อมูลลงไฟล์
รูปแบบการประกาศออบเจ็กต์ของคลาส CSidioFile มีดังนี้
CStdioFile (“ชื่อไฟล์”,รูปแบบของการเปิดไฟล์)
คอนสตรักเตอร์ของคลาส CStdioFile นั้นต้องการพารามิเตอร์ 2 ตัวด้วยกัน ตัวแรก ก็คือที่อยู่ของไฟล์ที่ต้องการเปิด (Path) และตัวที่สองก็คือ รูปแบบของการเปิดไฟล์ ซึ่งคลาส CStdioFile นี้เป็นคลาสที่สืบทอดมาจากคลาส CFileฉะนั้น การกำหนดรูปแบบของการเปิดไฟล์จึงต้องอาศัยค่า Flag ที่กำหนดเอาไว้ในคลาส CFile ดังนี้
CFile::mideCreate เปิดไฟล์ใหม่ (สร้างไฟล์ใหม่)
CFile::modeRead เปิดไฟล์ที่มีอยู่เพื่ออ่าน
CFile::modeWrite เปิดไฟล์ที่มีอยู่เพื่อเขียนข้อมูล
CFile::modeReadWrite เปิดไฟล์เพื่ออ่านและเขียนข้อมูล
การอ่านข้อมูลจากไฟล์
สมมติว่าต้องการเปิดไฟล์ example.txt ขึ้นมาเพื่ออ่านข้อมูล จะต้องเขียนโค้ดโปรแกรมดังนี้
CStdioFile exfile(“C:\\example.txt”,CFile::modeRead);
หากต้องการเปิดไฟล์เพื่ออ่านและเขียนด้วย จะต้องเขียนโค้ด ดังนี้
CStdilFile exfile(“C:\\example.txt”,
CFile:;modeREad/CFile:;modeWrite);
และหากการสร้างไฟล์นั้นเป็นการสร้างไฟล์ครั้งแรก จะใช้ CFile::modeCreate เพื่อสร้างไฟล์ใหม่ดังนี้ (แต่ถ้ามีไฟล์เก่าอยู่จะถูกเขียนทับทันที)
CStdioFile exfile(“C:\\example.txt”,CFile::modeCreate);
เมื่อไฟล์ example.txt ถูกเปิดเพื่ออ่าน (CFile:;modeRead) เรียบร้อยแล้ว จะใช้ฟังก์ชันReadString( ) เพื่ออ่านข้อมูลจากไฟล์ ซึ่งฟังก์ชัน ReadString( ) นี้จะคืน (Return) ข้อความที่อ่านจากไฟล์กลับมา จะต้องกำหนดตัวแปรขึ้นมารองรับและนำค่าที่ได้ไปใช้
ตัวอย่างที่11-1 เป็นการเปิดไฟล์ example.txt และอ่านข้อมูลภายในไฟล์นั้นออกมา
CSidioFile exfile(“C:\\example.txt”,CFile::modeRead);
CString buffer;
Exfile.ReadString(buffer);
AfcMessageBox(buffer);
จากโค้ดโปรแกรมในข้างต้น ออบเจ็กต์ exfile ได้เปิดไฟล์ example.txt ขึ้นมา และอ่านข้อมูลจากไฟล์มาเก็บไว้ที่ตัวแปร buffer จากนั้นก็นำเอาค่าจากตัวแปร buffer ไปแสดงออกใน Text Box IDC_TEXT ในไดอะล็อกโปรแกรม ก็สามารถทำได้โดยใช้ฟังก์ชันต่อไปนี้
SetDigItemText(IDC_TEXT.buffer);
หรือถ้าหากเท็กซ์บ็อกซ์นั้นมีการแสดงตัวแปร DDX เอาไว้ จะต้องเขียนโค้ดโปรแกรมดังนี้ เพื่อทำการอัพเดตข้อมูลในคอนโทรล
M_text = buffer;
UpdateDate(FALSE);
ตัวอย่างที่ 11-2 เทคนิคการอ่านข้อมูลจากไฟล์ โดยใช้คลาส CStdioFile ให้วิเคราะห์โปรแกรมต่อไปนี้
CStdioFile s(“c\\example.txt1”,CFile::modeRead);
CString buff.msg;
While(!feof(s.m_pStream)) {
s.ReadString(buff);
msg+=buff;
msg+= “\n”;
}
MessageBox(msg);
จากโปรแกรมในข้างต้น เป็นการสร้างออบเจ็กต์ของ CStdioFile ก็คือ s ให้เปิดไฟล์ example.txt ซึ่งอยู่ในไดรฟ์ C: โดยเปิดอ่านแบบ ModeRead หรือแบบอ่านอย่างเดียว จากนั้นเข้าสู่ลูป while และอ่านข้อมูลจากไฟล์จนสิ้นสุดไฟล์ โดยตรวจสอบ m_pStream ซึ่งเป็นตัวชี้ตำแหน่งของไฟล์ว่าเป็น Null หรือไม่ โดยใช้ฟังก์ชัน feof() ตรวจสอบ
ฟังก์ชัน ReadString จะอ่านข้อมูลในแต่ละบรรทัดของไฟล์มาเก็บไว้ที่ตัวแปร buff จากนั้นให้เก็บลงตัวแปร msg และปิดท้ายด้วย \n เป็นการสั่งให้ขึ้นบรรทัดใหม่ เมื่ออ่านข้อมูลครบก็จะหลุดออกจากลูป whie และแสดงผลข้อมูลที่อยู่ในตัวแปร msg ซึ่งก็คือไฟล์ example.txt นั่นเอง
การบันทึกข้อมูลลงไฟล์
การบันทึกข้อมูลลงไฟล์สามารถทำได้โดยใช้ฟังก์ชัน WriteString( ) ซึ่งการเขียนข้อมูลนั้นสามารถใช้ข้อมูลที่อยู่ในรูปออบเจ็กต์ CString หรือ char* ก็ได้ เพราะโอเวอร์โหลดฟังก็ชัน WriteString( ) ยอมให้ใช้พารามิเตอร์คนละประเภทได้
ตัวอย่างที่ 11-3 แสดงการเขียนข้อมูลลงไฟล์ data.txt
CStdioFile file(“data.txt”,
CFile::modeCreate/CFile::modeWrite);
file.WriteString(“Hello this is a test\n”);
file.WriteString(“Everything is a test”);
เมื่อรันโค้ดโปรแกรมในข้างต้น โปรแกรมจะทำการสร้างไฟล์ data.txt ขึ้นมาให้ใหม่ (ModeCreate) และกำหนดให้เป็นโหมดเขียนไฟล์ (ModeWrite) จากนั้นทำการเขียนประโยคลงไป 2 ประโยค โดยกำหนด \n ลงไปในประโยคแรกเพื่อขึ้นบรรทัดใหม่
หากในการเขียนโปรแกรมต้องการให้นำค่าที่อยู่ในเท็กซ์บ็อกซ์ IDC_TEXT มาเก็บลงไฟล์ เราสามารถทำได้โดยสร้างตัวแปร DDX ของเท็กซ์บ็อกซ์ IDC_TEXT นี้ขึ้นมา จากนั้นก็นำข้อมูลในตัวแปรนี้ไปเก็บลงไฟล์ ดังโค้ดโปรแกรมต่อไปนี้
UpdateData(TRUE);
File.WriteString(m_text);
การทำงานร่วมกับอุปกรณ์ของวินโดวส์
มาทำความเข้าใจกับการทำงานร่วมกับอินเตอร์เฟสในวินโดวส์ โดยจะมาสร้างโปรเจ็กต์เพื่อทดสอบ ซึ่งโปรเจ็กต์นี้มีชื่อว่า TestFile โดยจะสร้างเท็กซ์บ็อกซ์แบบ Single Line ขึ้นมา 1 อันพร้อมกับปุ่ม 2 ปุ่ม คือ Save และ Load และจะกำหนดให้โปรแกรมมีเงื่อนไขดังนี้
1.เมื่อกดปุ่ม Save ให้โปรแกรมบันทึกข้อความที่อยู่ในเท็กซ์บ็อกซ์ลงไฟล์ชื่อ data.txt จากนั้นให้ลบข้อมูลในเท็กซ์บ็อกซ์ให้ว่าง
2.เมื่อกดปุ่ม Load ให้นำข้อมูลที่อย่ในไฟล์ data.txt มาแสดงในเท็กซ์บ็อกซ์ เราจะมาทดลองสร้างโปรเจ็กต์ TestFile ดังขั้นตอนต่อไปนี้
ขั้นที่ 1 สร้างโปรเจ็กต์ TestFile
ให้สร้างโปรเจ็กต์ใหม่ด้วย AppWizard โดยกำหนดตัวเลือกของโปรเจ็กต์ไปที่ Dialog-Based กำหนดชื่อโปรเจ็กต์ให้เป็น TestFile
ขั้นที่ 2 แก้ไขไดอะล็อก IDD_TESTFILE_DIALOG
ให้ปรับแต่งไดอะล็อก IDD_TESTFILE_DIALOG ให้เล็กลง และให้ลบปุ่ม OK และ Cancel ออกไป จากนั้นจะสร้างปุ่มใหม่ 2 ปุ่มด้วยกัน โดยกำหนดให้มีค่า ID ของปุ่มดังนี้
- ปุ่ม Save กำหนด ID ให้เป็น IDSAVE และแคปชั่นเป็น Save
- ปุ่ม Load กำหนด ID ให้เป็น IDLOAD และแคปชันเป็น Load
- เท็กซ์บ็อกซ์ กำหนด ID ของเท็กซ์บ็อกซ์ให้เป็น IDC_TEXT
ขั้นที่ 3 เพิ่มตัวแปร DDX ให้กับเท็กซ์บ็อกซ์ IDC_TEXT
ให้เรียก ClassWizard โดยกด <Crtl+W> จากนั้น Click ไปที่ แท็บที่ 2 Member Variable เพื่อเพิ่มตัวแปร m_text ให้กับเท็กซ์บ็อกซ์ IDC_TEXT กำหนดให้เป็นตัวแปรแบบ CString
ขั้นที่ 4 เขียนโค้ดโปรแกรมให้กับปุ่ม Save
ให้แมปเมสเสจ BN_CLICKED ให้กับปุ่ม Save โดยใช้ Class Wizard จะได้คลาส OnSave() ขึ้นมารองรับการกดปุ่ม Save ให้แก้ไขโค้ดโปรแกรมให้เป็น ดังนี้
Void CTestFileDlg::OnSave()
{
UpdateDate(TRUE);
if (m_text!=””){
CSidioFile file(“D:\\data.txt”,CFile::modeCreate CFile::modeWrite);
file.WriteString(m_text);
m_text=””;
UpdateData(FALSE);
}
}
เมื่อรันโปรแกรมจะพบกับหน้าต่างดังรูป ให้พิมพ์ข้อความใดๆ ลงไป และกดปุ่ม Save ข้อความนั้นจะถูกบันทึกลงในไฟล์ชื่อ data.txt ที่ถูกสร้างขึ้นใหม่ (ModeCreate) ซึ่งถ้า m_text ไม่มีข้อความอยู่ โปรแกรมจะไม่ทำการเขียนไฟล์ใดๆ เลย เพราะเงื่อนไขไม่เป็นจริง
เมื่อโปรแกรมเขียนไฟล์เสร็จแล้ว ก็จะทำให้ตัวแปร m_text ว่าง จากนั้น UpdateDate(FALSE) เพื่อแสดงค่าออกทางเท็กซ์บ็อกซ์ตามลำดับ
ขั้นที่ 5 เขียนโค้ดให้กับปุ่ม Load
ทำเหมือนเดิม คือ แมปเมสเสจ BN_CLICKED ให้กับปุ่ม IDLOAD โดยใช้ Class Wizard จากนั้นเขียนโค้ดโปรแกรมดังต่อไปนี้ลงไปในฟังก์ชัน OnLoad ( )
เมื่อรันโปรแกรมจากเท็กซ์บ็อกซ์ IDC_TEXT ที่ว่างๆ ให้กดปุ่ม Load ข้อความที่อยู่ในไฟล์ data.txt ก็จะถูกอ่านมาแสดงในเท็กซ์บ็อกซ์โดยอัตโนมัติ
ในบทเรียนนี้จะได้รู้จักกับเทคนิคและวิธีการจัดการไฟล์แบบต่างๆ โดยใช้ Standard Library รวมทั้งการใช้คลาสจาก MFC ด้วยเนื้อหาในบท มีดังนี้
-การจัดการ Text File โดยใช้คลาสจาก MFC
- การทำงานร่วมกับอุปกรณ์ของวินโดวส์
การจักการ Text File โดยใช้คลาสจาก MFC
คลาสที่ใช้สำหรับจัดการไฟล์ใน MFC ที่จะนำใช้มีอยู่ 2 คลาส คือ
1.คลาส CFile เป็นคลาสแม่ของคลาสที่ใช้ในการจัดการไฟล์ทั้งหมดของ MFC
2.คลาส CStdioFile สืบทอดจาก CFile ใช้สำหรับจัดการเท็กซ์ไฟล์โดยเฉพาะ
การใช้งานคลาส CStdioFileบอกได้ว่าการเรียกฟังก์ชันจากคลาสที่ตรงไปตรงมาสามารถเขียนข้อมูลในรูปของคลาส CString และอ่านข้อมูลมาเก็บอยู่ในรูปของคลาส CString ได้
รายละเอียด แบะฟังก์ชันที่เป็นสมาชิกของาคลาส CStdioFile มีดังนี้
M_pStream เป็นตัวแปรพอยน์เตอร์ที่จะชี้ตำแหน่งปัจจุบันของไฟล์
CstdioFile( ) เป็นฟังก์ชันคอนสตรักเตอร์ของคลาส CStdioFile
ReadString( ) อ่านข้อมูลจากไฟล์
WriteString( ) เขียนข้อมูลลงไฟล์
รูปแบบการประกาศออบเจ็กต์ของคลาส CSidioFile มีดังนี้
CStdioFile (“ชื่อไฟล์”,รูปแบบของการเปิดไฟล์)
คอนสตรักเตอร์ของคลาส CStdioFile นั้นต้องการพารามิเตอร์ 2 ตัวด้วยกัน ตัวแรก ก็คือที่อยู่ของไฟล์ที่ต้องการเปิด (Path) และตัวที่สองก็คือ รูปแบบของการเปิดไฟล์ ซึ่งคลาส CStdioFile นี้เป็นคลาสที่สืบทอดมาจากคลาส CFileฉะนั้น การกำหนดรูปแบบของการเปิดไฟล์จึงต้องอาศัยค่า Flag ที่กำหนดเอาไว้ในคลาส CFile ดังนี้
CFile::mideCreate เปิดไฟล์ใหม่ (สร้างไฟล์ใหม่)
CFile::modeRead เปิดไฟล์ที่มีอยู่เพื่ออ่าน
CFile::modeWrite เปิดไฟล์ที่มีอยู่เพื่อเขียนข้อมูล
CFile::modeReadWrite เปิดไฟล์เพื่ออ่านและเขียนข้อมูล
การอ่านข้อมูลจากไฟล์
สมมติว่าต้องการเปิดไฟล์ example.txt ขึ้นมาเพื่ออ่านข้อมูล จะต้องเขียนโค้ดโปรแกรมดังนี้
CStdioFile exfile(“C:\\example.txt”,CFile::modeRead);
หากต้องการเปิดไฟล์เพื่ออ่านและเขียนด้วย จะต้องเขียนโค้ด ดังนี้
CStdilFile exfile(“C:\\example.txt”,
CFile:;modeREad/CFile:;modeWrite);
และหากการสร้างไฟล์นั้นเป็นการสร้างไฟล์ครั้งแรก จะใช้ CFile::modeCreate เพื่อสร้างไฟล์ใหม่ดังนี้ (แต่ถ้ามีไฟล์เก่าอยู่จะถูกเขียนทับทันที)
CStdioFile exfile(“C:\\example.txt”,CFile::modeCreate);
เมื่อไฟล์ example.txt ถูกเปิดเพื่ออ่าน (CFile:;modeRead) เรียบร้อยแล้ว จะใช้ฟังก์ชันReadString( ) เพื่ออ่านข้อมูลจากไฟล์ ซึ่งฟังก์ชัน ReadString( ) นี้จะคืน (Return) ข้อความที่อ่านจากไฟล์กลับมา จะต้องกำหนดตัวแปรขึ้นมารองรับและนำค่าที่ได้ไปใช้
ตัวอย่างที่11-1 เป็นการเปิดไฟล์ example.txt และอ่านข้อมูลภายในไฟล์นั้นออกมา
CSidioFile exfile(“C:\\example.txt”,CFile::modeRead);
CString buffer;
Exfile.ReadString(buffer);
AfcMessageBox(buffer);
จากโค้ดโปรแกรมในข้างต้น ออบเจ็กต์ exfile ได้เปิดไฟล์ example.txt ขึ้นมา และอ่านข้อมูลจากไฟล์มาเก็บไว้ที่ตัวแปร buffer จากนั้นก็นำเอาค่าจากตัวแปร buffer ไปแสดงออกใน Text Box IDC_TEXT ในไดอะล็อกโปรแกรม ก็สามารถทำได้โดยใช้ฟังก์ชันต่อไปนี้
SetDigItemText(IDC_TEXT.buffer);
หรือถ้าหากเท็กซ์บ็อกซ์นั้นมีการแสดงตัวแปร DDX เอาไว้ จะต้องเขียนโค้ดโปรแกรมดังนี้ เพื่อทำการอัพเดตข้อมูลในคอนโทรล
M_text = buffer;
UpdateDate(FALSE);
ตัวอย่างที่ 11-2 เทคนิคการอ่านข้อมูลจากไฟล์ โดยใช้คลาส CStdioFile ให้วิเคราะห์โปรแกรมต่อไปนี้
CStdioFile s(“c\\example.txt1”,CFile::modeRead);
CString buff.msg;
While(!feof(s.m_pStream)) {
s.ReadString(buff);
msg+=buff;
msg+= “\n”;
}
MessageBox(msg);
จากโปรแกรมในข้างต้น เป็นการสร้างออบเจ็กต์ของ CStdioFile ก็คือ s ให้เปิดไฟล์ example.txt ซึ่งอยู่ในไดรฟ์ C: โดยเปิดอ่านแบบ ModeRead หรือแบบอ่านอย่างเดียว จากนั้นเข้าสู่ลูป while และอ่านข้อมูลจากไฟล์จนสิ้นสุดไฟล์ โดยตรวจสอบ m_pStream ซึ่งเป็นตัวชี้ตำแหน่งของไฟล์ว่าเป็น Null หรือไม่ โดยใช้ฟังก์ชัน feof() ตรวจสอบ
ฟังก์ชัน ReadString จะอ่านข้อมูลในแต่ละบรรทัดของไฟล์มาเก็บไว้ที่ตัวแปร buff จากนั้นให้เก็บลงตัวแปร msg และปิดท้ายด้วย \n เป็นการสั่งให้ขึ้นบรรทัดใหม่ เมื่ออ่านข้อมูลครบก็จะหลุดออกจากลูป whie และแสดงผลข้อมูลที่อยู่ในตัวแปร msg ซึ่งก็คือไฟล์ example.txt นั่นเอง
การบันทึกข้อมูลลงไฟล์
การบันทึกข้อมูลลงไฟล์สามารถทำได้โดยใช้ฟังก์ชัน WriteString( ) ซึ่งการเขียนข้อมูลนั้นสามารถใช้ข้อมูลที่อยู่ในรูปออบเจ็กต์ CString หรือ char* ก็ได้ เพราะโอเวอร์โหลดฟังก็ชัน WriteString( ) ยอมให้ใช้พารามิเตอร์คนละประเภทได้
ตัวอย่างที่ 11-3 แสดงการเขียนข้อมูลลงไฟล์ data.txt
CStdioFile file(“data.txt”,
CFile::modeCreate/CFile::modeWrite);
file.WriteString(“Hello this is a test\n”);
file.WriteString(“Everything is a test”);
เมื่อรันโค้ดโปรแกรมในข้างต้น โปรแกรมจะทำการสร้างไฟล์ data.txt ขึ้นมาให้ใหม่ (ModeCreate) และกำหนดให้เป็นโหมดเขียนไฟล์ (ModeWrite) จากนั้นทำการเขียนประโยคลงไป 2 ประโยค โดยกำหนด \n ลงไปในประโยคแรกเพื่อขึ้นบรรทัดใหม่
หากในการเขียนโปรแกรมต้องการให้นำค่าที่อยู่ในเท็กซ์บ็อกซ์ IDC_TEXT มาเก็บลงไฟล์ เราสามารถทำได้โดยสร้างตัวแปร DDX ของเท็กซ์บ็อกซ์ IDC_TEXT นี้ขึ้นมา จากนั้นก็นำข้อมูลในตัวแปรนี้ไปเก็บลงไฟล์ ดังโค้ดโปรแกรมต่อไปนี้
UpdateData(TRUE);
File.WriteString(m_text);
การทำงานร่วมกับอุปกรณ์ของวินโดวส์
มาทำความเข้าใจกับการทำงานร่วมกับอินเตอร์เฟสในวินโดวส์ โดยจะมาสร้างโปรเจ็กต์เพื่อทดสอบ ซึ่งโปรเจ็กต์นี้มีชื่อว่า TestFile โดยจะสร้างเท็กซ์บ็อกซ์แบบ Single Line ขึ้นมา 1 อันพร้อมกับปุ่ม 2 ปุ่ม คือ Save และ Load และจะกำหนดให้โปรแกรมมีเงื่อนไขดังนี้
1.เมื่อกดปุ่ม Save ให้โปรแกรมบันทึกข้อความที่อยู่ในเท็กซ์บ็อกซ์ลงไฟล์ชื่อ data.txt จากนั้นให้ลบข้อมูลในเท็กซ์บ็อกซ์ให้ว่าง
2.เมื่อกดปุ่ม Load ให้นำข้อมูลที่อย่ในไฟล์ data.txt มาแสดงในเท็กซ์บ็อกซ์ เราจะมาทดลองสร้างโปรเจ็กต์ TestFile ดังขั้นตอนต่อไปนี้
ขั้นที่ 1 สร้างโปรเจ็กต์ TestFile
ให้สร้างโปรเจ็กต์ใหม่ด้วย AppWizard โดยกำหนดตัวเลือกของโปรเจ็กต์ไปที่ Dialog-Based กำหนดชื่อโปรเจ็กต์ให้เป็น TestFile
ขั้นที่ 2 แก้ไขไดอะล็อก IDD_TESTFILE_DIALOG
ให้ปรับแต่งไดอะล็อก IDD_TESTFILE_DIALOG ให้เล็กลง และให้ลบปุ่ม OK และ Cancel ออกไป จากนั้นจะสร้างปุ่มใหม่ 2 ปุ่มด้วยกัน โดยกำหนดให้มีค่า ID ของปุ่มดังนี้
- ปุ่ม Save กำหนด ID ให้เป็น IDSAVE และแคปชั่นเป็น Save
- ปุ่ม Load กำหนด ID ให้เป็น IDLOAD และแคปชันเป็น Load
- เท็กซ์บ็อกซ์ กำหนด ID ของเท็กซ์บ็อกซ์ให้เป็น IDC_TEXT
ขั้นที่ 3 เพิ่มตัวแปร DDX ให้กับเท็กซ์บ็อกซ์ IDC_TEXT
ให้เรียก ClassWizard โดยกด <Crtl+W> จากนั้น Click ไปที่ แท็บที่ 2 Member Variable เพื่อเพิ่มตัวแปร m_text ให้กับเท็กซ์บ็อกซ์ IDC_TEXT กำหนดให้เป็นตัวแปรแบบ CString
ขั้นที่ 4 เขียนโค้ดโปรแกรมให้กับปุ่ม Save
ให้แมปเมสเสจ BN_CLICKED ให้กับปุ่ม Save โดยใช้ Class Wizard จะได้คลาส OnSave() ขึ้นมารองรับการกดปุ่ม Save ให้แก้ไขโค้ดโปรแกรมให้เป็น ดังนี้
Void CTestFileDlg::OnSave()
{
UpdateDate(TRUE);
if (m_text!=””){
CSidioFile file(“D:\\data.txt”,CFile::modeCreate CFile::modeWrite);
file.WriteString(m_text);
m_text=””;
UpdateData(FALSE);
}
}
เมื่อรันโปรแกรมจะพบกับหน้าต่างดังรูป ให้พิมพ์ข้อความใดๆ ลงไป และกดปุ่ม Save ข้อความนั้นจะถูกบันทึกลงในไฟล์ชื่อ data.txt ที่ถูกสร้างขึ้นใหม่ (ModeCreate) ซึ่งถ้า m_text ไม่มีข้อความอยู่ โปรแกรมจะไม่ทำการเขียนไฟล์ใดๆ เลย เพราะเงื่อนไขไม่เป็นจริง
เมื่อโปรแกรมเขียนไฟล์เสร็จแล้ว ก็จะทำให้ตัวแปร m_text ว่าง จากนั้น UpdateDate(FALSE) เพื่อแสดงค่าออกทางเท็กซ์บ็อกซ์ตามลำดับ
ขั้นที่ 5 เขียนโค้ดให้กับปุ่ม Load
ทำเหมือนเดิม คือ แมปเมสเสจ BN_CLICKED ให้กับปุ่ม IDLOAD โดยใช้ Class Wizard จากนั้นเขียนโค้ดโปรแกรมดังต่อไปนี้ลงไปในฟังก์ชัน OnLoad ( )
เมื่อรันโปรแกรมจากเท็กซ์บ็อกซ์ IDC_TEXT ที่ว่างๆ ให้กดปุ่ม Load ข้อความที่อยู่ในไฟล์ data.txt ก็จะถูกอ่านมาแสดงในเท็กซ์บ็อกซ์โดยอัตโนมัติ