Thursday, December 26, 2013

โปรแกรมอ่านข้อมูลจาก text file ด้วยภาษา c++

จากบทความโปรแกรมบันทึกข้อมูลลง text file ด้วยภาษา c++ ที่ได้นำเสนอไป ในบทความนี้ผมจะขอนำเสนอโปรแกรมอ่านข้อมูลจาก text file ด้วยภาษา c++ ซึ่งจะเป็นแสดงให้เห็นถึงการใช้ฟังก์ชันต่างๆใน library ของซีและซีพลัสพลัสมากขึ้น โดยโปรแกรมเล็กๆนี้เราสามารถนำไปใช้ในการแก้ปัญหาที่ต้องใช้เวลาในการดำเนินการมากได้เป็นอย่างดี รวมถึงนำไปประยุกต์เป็นฟังก์ชันเล็กๆในโปรแกรมขนาดใหญ่ที่เราจะพัฒนาในลำดับถัดไปครับ ตัวอย่างที่จะนำเสนอในวันนี้คือ การอ่านค่าสมาชิกใน matrix ซึ่งถูกเก็บไว้ใน text file ผ่านตัวแปร Dynamic Array  สมมุติเรามีสมาชิกใน matrix เก็บไว้ใน text file ชื่อ K.txt โดยมีข้อมูลเป็นจำนวนเต็ม matrix 3x3 ดังนี้
1 5 10
2 10 20
3 15 30
ในการอ่านไฟล์ txt เราจะใช้ ฟังก์ชัน fscanf เรามาเขียนโปรแกรมกัน



ผลการรันโปรแกรมจะแสดงผลสมาชิกของ Matrix 3x3 มาดังนี้

1 5 10
2 10 20
3 15 30

จาก Source Code โปรแกรม จะเริ่มจากการสร้างตัวแปร pointer ชนิด FILE เพื่อใช้เปิดไฟล์ text และสร้างตัวแปร K ชนิด Integer เป็น Dynamic Array แบบสองมิติ ขนาด 3x3 
จากนั้นจะทำการเปิดไฟล์ K.txt และตรวจสอบตัวแปร fp เพื่อพิจารณาผลลัพธ์ของการเปิดไฟล์ 
หากเปิดไฟล์ได้ก็จะเริ่มอ่านไฟล์ตั้งแต่แถวที่ 1 จนกระทั่งสิ้นสุดไฟล์ และปิดไฟล์ด้วยฟังก์ชัน fclose() และทำการแสดงสมาชิกที่อ่านเข้ามาเก็บไว้ที่ตัวแปร k 
จากโค้ดโปรแกรมจำนวนแถวของข้อมูลจะถูกเก็บไว้ที่ตัวแปร m ซึ่งสามารถนำไปใช้งานในการกำหนดขนาดของตัวแปร Array อื่นๆได้ครับ 
มาดูฟังก์ชัน fscanf กันครับ หากรูปแบบของข้อมูลใน text file มี , กั้นระหว่างสมาชิก (จะพบในกรณีที่เรา export file .csv จาก Excel) ในการใช้ฟังก์ชัน fscanf ก็จะต้องกำหนดรูปแบบให้สอดคล้องกันดังนี้
หรือในกรณีที่สมาชิกเป็นข้อมูลประเภทมีจุดทศนิยม เราก็ต้องปรับชนิดของตัวแปร k ให้เป็น float หรือ double เพื่อให้สอดคล้องกับข้อมูลมิเช่นนั้นจะเกิดการสูญเสียข้อมูลไป ทำให้เกิดความผิดพลาดจากการนำข้อมูลนี้ไปใช้งานประมวลผลต่อครับ

จากโค้ดนี้ท่านก็จะได้ Matrix 3x3 เก็บไว้ใน ARRAY เรียบร้อย และก็นำไปดำเนินการทาง matrix ได้ต่อไปครับ ไม่ว่าจะเป็น บวก ลบ คูณ หรือเตรียมสำหรับการ แก้ระบบสมการ ด้วยระเบียบวิธีทางตัวเลข (Numerical Method) ต่อไป สำหรับวิศวกร หรือนักวิทยาศาสตร์นะครับ เสริมท้ายก่อนจบ หากท่านมีข้อมูลใน text ไฟล์เป็นพันหรือหมื่นบรรทัด การใช้โปรแกรมนี้ประยุกต์เช้าไปอ่านก็สามารถทำได้โดยง่าย สวัสดีครับ


Monday, December 16, 2013

โปรแกรมภาษา C++ : ตอนการอ่านข้อมูลจาก Binary File (How to read the binary file)

สวัสดีครับ บทความนี้เป็นบทความต่อจาก การเขียนโปรแกรมภาษา C++ สำหรับการบันทึกข้อมูล Binary file โดยในบทความนี้จะเสนอการอ่านหรือโหลดข้อมูลจาก Binary File จากเรื่องการบันทึกข้อมูล ท่านผู้อ่านคงจำได้ว่า Binary File เป็นไฟล์ที่มีการเก็บข้อมูลแบบเป็นโครงสร้างและเรียงลำดับอย่างเป็นระบบ ซึ่งหากโปรแกรมเมอร์ต้องการเข้าไปอ่านหรือโหลดข้อมูลจากไฟล์เหล่านี้มาใช้งาน จำเป็นอย่างยิ่งที่ต้องรู้จักโครงสร้างของข้อมูลดังกล่าว ยกตัวอย่างเช่น การเปิดไฟล์ภาพชนิดต่างๆ หรือไฟล์เสียงต่างๆ หรือแม้กระทั่งไฟล์จากโปรแกรม Microsoft office ทั้งหลาย หากเรารู้จักโครงสร้างของมันเราก็จะเข้าไปอ่านข้อมูลได้เช่นกัน  ดังนั้นจึงจำเป็นต้องพัฒนาโปรแกรมที่รู้จักโครงสร้างการเก็บข้อมูลของ Binary File นั้นๆครับ ขอยกตัวอย่าง Code Program ภาษา C++ ที่ได้นำเสนอการบันทึกข้อมูลลงไฟล์ DATA.bin ไปแล้วนะครับ การเข้าไปอ่านข้อมูลจำเป็นอย่างยิ่งที่ต้องกำหนดตำแหน่งในการเข้าถึงข้อมูลและกำหนดขนาดของข้อมูลที่ต้องการโหลดมาใช้งาน โดยจะใช้ฟังก์ชัน fread ในการเข้าถึงตำแหน่งข้อมูลและโหลดข้อมูล 
โดยลำดับแรก จะต้องกำหนดตัวแปรที่ใช้เก็บข้อมูล มาดู Code Program กันครับ


เมื่อคอมไพล์โปรแกรมจะปรากฏเลข 1 - 100 บนหน้าจอ จาก Code Program ดังกล่าวเป็นการอ่านหรือโหลดข้อมูลตั้งแต่ลำดับแรกจนถึงลำดับสุดท้ายจากไฟล์ DATA.bin โดยโปรแกรมเมอร์ทราบอยู่แล้วว่ามีข้อมุลชนิด INT เก็บในไฟล์ DATA จำนวน 100 ชุด ในกรณีที่ต้องการอ่านข้อมูลที่ละชุดไล่ไปเรื่อยๆจนหมด (ตรวจสอบโดยฟังก์ชัน feof() ) สามารถเขียน Code Program ได้ดังนี้ ซึ่งจะได้ผลลัพธ์เหมือน Code Program ก่อนหน้านี้



ในกรณีต้องการระบุตำแหน่งที่จะเริ่มอ่านข้อมูล เราจะต้องอาศัยฟังก์ชัน fseek ในการเลื่อนพอย์เตอร์ไปยังตำแหน่งที่ระบุ ดังตัวอย่าง Code Program ที่ต้องการอ่านข้อมูลในอาเรย์ตัวที่ 3 จนถึงตัวที่ 5 


ผลการคอมไพล์ Code Program ดังกล่าวจะปรากฎเลข 3 4 5 เรียงกันบนหน้าจอ 
มาถึงตรงนี้โปรแกรมเมอร์ภาษาซีทุกท่านคงจะเข้าใจถึงวิธีการอ่านหรือโหลดข้อมูลในไฟล์ Binary กันแล้วนะครับ และจะเห็นว่าเราสามารถบริหารจัดการข้อมูลที่อ่านมาได้อย่างง่ายๆครับ เพียงเราทราบโครงสร้างของไฟล์ดังกล่าว ก่อนจบมีโจทย์เล็กๆให้ปรับปรุงนะครับ สมมุติเราไม่ทราบจำนวนชุดข้อมูลที่อยู่ในไฟล์ดังกล่าว เราจะต้องทำอย่างไรถึงจะอ่านข้อมูลและนำข้อมูลที่อ่านได้มาเก็บไว้ในตัวแปรเพื่อใช้งานต่อไป 
ผมแนะนำฟังก์ชัน fseek และการระบุตำแหน่งพอย์เตอร์ไปยังจุดสุดท้ายของไฟล์ด้วย SEEK_END และรอ่านขนาดของไฟล์ด้วยฟังก์ชัน ftell(fp) จากนั้นท่านสามารถคำนวณหาจำนวนชุดข้อมูลด้วยการหารขนาดของไฟล์ด้วยขนาดของชนิดตัวแปร ใช้ fseek และระบุด้วย SEEK_SET เพื่อเลื่อนพอยเตอร์มายังจุดเริ่มต้นของไฟล์ และเมื่อเราทราบจำนวนชุดของตัวแปรแล้ว เราสามารถใช้วิธีการสร้างอาเรย์แบบไดนามิกส์ที่ได้นำเสนอมาแล้วช่วยในการเก็บบันทึกข้อมูลครับ มาดู Code Program กันครับ




Saturday, December 14, 2013

โปรแกรมภาษา C++ : ตอนการเก็บข้อมูลลงใน Disk แบบ Binary File

การเขียนโปรแกรมภาษา c++ วันนี้จะนำเสนอ วิธีการเก็บข้อมูลลง Disk แบบ Binary File ซึ่งจะมีจุดเด่นในด้านการจัดการและการเข้าถึงข้อมูลได้ง่ายและเป็นระบบกว่า การเก็บข้อมูลลงใน Disk แบบ Text File มาดู Code  การบันทึกข้อมูลแบบ Binary File กันครับ


เมื่อคอมไพล์โปรแกรมท่านจะได้ไฟล์ DATA.bin มาหนึ่งไฟล์ แต่จะไม่สามารถใช้ Nodepad เปิดดูข้อมูลในไฟล์นี้ได้นะครับ เนื่องจากไฟล์ DATA.bin มีโครงสร้างการเก็บที่ Nodepad ไม่รู้จักนั่นเอง และเมื่อตรวจสอบขนาดไฟล์จะพบว่ามีขนาดเท่ากับ 4 ไบต์ เนื่องจากข้อมูลที่เราเก็บลงไปเป็นชนิด int ซึ่งมีขนาดเท่ากับ 4 ไบต์ 
ฟังก์ชั่น fwrite เป็นฟังก์ชันที่ใช้บันทึกข้อมูลลงไฟล์ โดยมีรูปแบบของฟังก์ชันดังนี้
พารามิเตอร์ตัวแรกเป็น address ของตัวแปรที่ต้องการเข้าถึงข้อมูลที่จะบันทึก
พารามิเตอร์ตัวที่สองเป็นขนาดของตัวแปรที่ต้องการบันทึกในแต่ละครั้ง โดยเราจะใช้ฟังก์ชัน Sizeof ช่วยคืนค่าขนาดของตัวแปรที่เราต้องการบันทึก
พารามิเตอร์ตัวสุดท้ายเป็น pointer ของ object FILE ที่ต้องการบันทึก

สมมุติ เราต้องการเก็บข้อมูลของตัวแปร int temp ลงไปในไฟล์ต่อจาก num เราจะแก้ไข code ดังนี้โดยไฟล์ DATA.bin จะมีขนาดเท่ากับ 8 ไบต์ เนื่องจากเก็บข้อมูลชนิด int ไว้ 2 ชุดนั่นเอง โดยจะจัดเรียงจากตัวแปร num และ temp ตามลำดับ


เราจะลองศึกษา code โปรแกรม ที่บันทึกข้อมูลแบบอาเรย์กันครับซึ่งไม่มีความยุ่งยากเลย ดังนี้


ท่านจะได้ไฟล์ DATA.bin ที่บรรจุตัวเลข 100 ตัว ตั้งแต่เลข 1-100 ซึ่งเรียงกันอยู่ในอาเรย์ครับ ส่วนขนาดของไฟล์ก็จะเท่ากับ 4*100 = 400 ไบต์ นั่นเอง 
ในบทความนี้ก็ได้นำเสนอการบันทึกข้อมูลลงไฟล์แบบ Binary File เรียบร้อยแล้วนะครับ ซึ่งที่สำคัญท่านจะพบว่า ไฟลืที่เราบันทึกข้อมูลจะมีความปลอดภัยสูง เนื่องจากเราจะไม่สามารถเปิดอ่านและแก้ไขข้อมูลในไฟล์ดังกล่าวได้เลยหากไๆม่ทราบโครงสร้างของการจัดเรียงข้อมูลในไฟล์ ซึ่งในบทความถัดไปจะนำเสนอการอ่านหรือโหลดข้อมูลในไฟล์ดังกล่าวครับ รวมถึงจะนำเสนอการนำไปประยุกต์อ่านข้อมูลไฟล์เสียงกันครับ

Friday, December 6, 2013

โปรแกรมภาษา C++ : ตอนการเก็บข้อมูลลงใน Disk แบบ Text File

การเขียนโปรแกรมภาษา c++ วันนี้จะนำเสนอ กระบวนการเก็บข้อมูลลงไฟล์ ซึ่งจะพบอยู่เป็นประจำสำหรับโปรแกรมเมอร์ โดยเฉพาะการเขียนโปรแกรมติดต่อกับ Hardware เช่น เครื่องรูดบัตร เครื่องบันทึกข้อมูลเป็นต้นซึ่งข้อมูลจะถูกเก็บไว้ใน Disk  และจะถูกอ่านเข้ามาใช้หรือเก็บไว้ใช้อยู่ตลอดเวลา โดยทั่วไปไฟล์จะแบ่งออกเป็น 2 ประเภท คือ Text File และ Binary File ในบทความนี้จะขอกล่าวถึง Text File ก่อนครับ มาดู Code  การบันทึกข้อมูลแบบ Text File กันครับ


เมื่อคอมไพล์โปรแกรมท่านจะได้ไฟล์ DATA.txt มาหนึ่งไฟล์ เมื่อเปิดด้วย Nodepad จะพบเลข 100 และเมื่อดูขนาดไฟล์จะพบว่ามีขนาดเท่ากับ 3 ไบต์ เนื่องจากการบันทึกไฟล์แบบ text มันจะเก็บเป็นตัวอักษร ซึ่งจากตัวอย่างเราเก็บเลข 100 ไว้ ดังนั้นจึงมีตัวอักษร 3 ตัว ตัวละ 1 ไบต์ ดังนั้นจึงมีขนาด 3 ไบต์ ทีนี้ลองปรับโค้ดโปรแกรมดูนะครับ หากเป็นดังนี้ text ไฟล์จะมีขนาดเท่าใด
float af ;
af = 120.56 ;
int mum ;
num = 100 ;

FILE *fp ;
fp = fopen("DATA.txt","wt") ;
fprint(fp,"%d %f" ,num,af);
fclose(fp);

จากจุดนี้จะพบว่าเป็นการยากมากที่จะทราบขนาดของไฟล์ได้ ซึ่งจะมีความยุ่งยากในการบริหารจัดการข้อมูลครับ ในบทความต่อไปจะนำเสนอการบันทึกข้อมูลลง Disk แบบ Binary ซึ่งมีรูปแบบและขนาดที่ชัดเจนทำให้การจัดการข้อมูลสามารถทำได้ง่ายและสะดวกครับ

Monday, December 2, 2013

โปรแกรมภาษา C++ : การเข้าถึงข้อมูลในอาเรย์

ตัวแปรแบบอาเรย์เป็นตัวแปรแบบตาราง ที่หนึ่งตัวแปรเก็บค่าได้หลายค่า ประโยชน์ของตัวแปรแบบ อาเรย์ช่วยในการประหยัดเวลาในการเก็บข้อมูล การบริหารจัดการข้อมูลทำได้อย่างมีประสิทธิภาพ สิ่งหนึ่งที่สำคัญในทางวิศวกรรมคือ กลุ่มตัวแปรแบบอาเรย์มักมีความสัมพันธ์กัน ในบทความนี้จะมาทำความรู้จักกับตัวแปรแบบอาเรย์ในภาษา c และ C++ กันครับ
1. การประกาศตัวแปรแบบอาเรย์
typeVar VarName[n]
เมื่อ
typeVar คือ ชนิดของตัวแปร
VarName คือ ชื่อของตัวแปรที่จะกำหนด
n คือจำนวนสมาชิกในอาเรย์ที่ต้องจองไว้ในหน่วยความจำนั้น

ตัวอย่างเช่น
int Element [10] ;

มิติของอาเรย์ 
อาเรย์มีหลายมิติขึ้นอยู่กับจัดเก็บข้อมูลหรือความสัมพันธ์นั้นๆ ในที่นี้ขอยกตัวอย่างอาเรย์ที่ใช้กันเยอะคือ
1 อาเรย์ 1 มิติ ตัวอย่างเช่น int Element [5] ข้อมูลจะเรียงกันเป็นตารางที่มีจำนวน 1 แถว และมีสมาชิก 10 หลัก 
2 อาเรย์ 2 มิติ ตัวอย่างเช่น int Element [4][5] ซึ่งข้อมูลหรือตัวแปรย่อยจะจัดเรียงในตารางที่มีจำนวน 4 แถว 5 หลัก หรือมองง่ายๆเป็น Matrix ขนาด 4x5 


ภาพที่ 1 อาเรย์แบบ 1 มิติ


ภาพที่ 2 อาเรย์ 2 มิติ
การกำหนดค่าตัวแปรอาเรย์
เทคนิคหนึ่งในการเขียนโปรแกรมภาษา c ก็คือ จะต้องกำหนดค่าให้กับตัวแปรก่อนนำไปใช้งาน เพื่อป้องกันความผิดพลาดที่จะเกิดขึ้น ในการกำหนดค่าตัวแปรอาเรย์สามารถทำได้โดยการเข้าถึงตัวแปรสมาชิกโดยตรงจากการอ้างตำแหน่งของตัวแปร ตัวอย่างเช่น ต้องการกำหนดค่าให้กับตัวแปร Element ตัวที่ 3 สามารถเขียนโค้ดได้ดังนี้
Element[2] = value ;   // index ของตัวแปรอาเรย์ในภาษาซีจะเริ่มที่ 0 จนถึง n-1 เมื่อ n คือ จำนวนสมาชิกในอาเรย์

ข้อควรจำ
หลังจากสร้างตัวแปรอาเรย์แล้วควรกำหนดค่าตัวแปรทันที เพื่อป้องกันความผิดพลาด โดยหากยังไม่มีข้อมูลให้กำหนดค่า Null ให้กับตัวแปร อาเรย์ โค้ตตัวอย่างการกำหนดค่า 0 ให้กับตัวแปรอาเรย์จะอาศัยคำสั่ง for ดังนี้
สมมุติ อาเรย์ 4X5
for( int i = 0 ; i < 4 ; i++)
{
     for(int j = 0 ; j < 5 ; j++)
     {
          Element[i][j] = 0 ;
     }
}

การเข้าถึงข้อมูลในตัวแปรอาเรย์
เราจะอ้างด้วยตำแหน่งของตัวแปรในอาเรย์นั้น ตามภาพที่ 1 และ 2
เช่น Element[0][1] หมายถึง ตำแหน่งแถวที่ 0 หลักที่ 1 เป็นต้น การใช้คำสั่ง for , while , do..while เพื่อใช้ในการเข้าถึงหรือกำหนดค่าเป็นสิ่งที่โปรแกรมเมอร์ต้องพบอยู่เสมอ

จากตัวอย่างข้างต้นเป็นการกำหนดตัวแปรอาเรย์แบบสเตติก ซึ่งต้องจองหน่วยความจำตั้งแต่เริ่มต้น ยังมีวิธีการกำหนดตัวแปรอาเรย์แบบ dynamic ซึ่งมักจะใช้ในกรณีที่ไม่ทราบจำนวนสมาชิกในตัวแปรอาเรย์ที่แน่นอน ซึ่งเราจะใช้ pointer มาช่วยในการกำหนด ซึ่งจะทำให้โปรแกรมเมอร์จองหน่วยความจำได้พอดีกับที่ต้องใช้งานจริง ตัวอย่างเช่น
อาเรย์ 1 มิติ
// C++
int * Element ;   // ประกาศไว้ตอนต้น
Element = NULL;

เมื่อจะใช้งาน
Element = new int [size];

// do some thing

เมื่อใช้เสร็จ
delete [] Element ;
Element = NULL ;

อาเรย์ 2 มิติ ขนาด row x col
int ** Element ;
Element = NULL ;

Element = new int* [row];
for (int i= 1 ; i < row ; i++)
{
    Element[i] = new int [col];
}
// do some thing
เมื่อใช้งานเสร็จ
for (int i = 1 ; i < row ; i++)
{
       delete [] Element[i];
}
delete [] Element ;
Element = NULL;

หลังจากศึกษาบทความนี้แล้วขอให้ท่านผู้อ่านลองกลับไปทบทวน การดำเนินการกับตัวแปรอาเรย์ดูนะครับ ซึ่งผมบอกได้เลยว่าหากเราควบคุมตัวแปรอาเรย์ได้ จะทำให้เรานำตัวแปรอาเรย์นี้ไปประยุกต์ใช้กับโค้ดโปรแกรมต่างๆได้อย่างมีประสิทธิภาพ ซึ่งจะนำเสนอในโอกาสต่อไป สวัสดีครับ