using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace BankAccount
{{
{
InitializeComponent();
}
{
{
cmd.Connection = c;
cmd.CommandText = "select top 1 balance from userAccount where accountName = @userAccountId";
cmd.Parameters.AddWithValue(
cmd.Parameters.AddWithValue("userAccountId","admin");
cmd.Connection.Open();
cmd.Connection.Open();
double balance = Convert.ToDouble(cmd.ExecuteScalar());
if (balance < Convert.ToDouble(txtm.Text.Trim()))
{
{
MessageBox.Show("เงินของท่านไม่เพียงพอในการโอน");
cmd.Connection.Close();
cmd.Connection.Close();return;
}
}
cmd.CommandText =@"
update userAccount set balance = @balanceDestination where accountName = @userAccountId_Destination;
update userAccount set balance = @balanceTarget where accountName = @userAccountId_Target
"
update userAccount set balance = @balanceDestination where accountName = @userAccountId_Destination;
update userAccount set balance = @balanceTarget where accountName = @userAccountId_Target
";//เป็นการแอดชื่อ พรามิเตอร์ที่เราใช้มา(ตัวที่เราใช้,ค่าที่เราเอา มาจากไหน)cmd.Parameters.AddWithValue("userAccountId_Destination", "admin");
cmd.Parameters.AddWithValue(
cmd.Parameters.AddWithValue("balanceDestination", balance - Convert.ToDouble(txtm.Text.Trim()));
cmd.Parameters.AddWithValue(
cmd.Parameters.AddWithValue("balanceTarget", balance + Convert.ToDouble(txtm.Text.Trim()));
cmd.Parameters.AddWithValue(
cmd.Parameters.AddWithValue("userAccountId_Target",txtget.Text.Trim());
{
}
}
}
}
}
}
}
public partial class FormTransfer : Form{public FormTransfer()
private void btnOK_Click(object sender, EventArgs e)
using (SqlConnection c = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=""C:\Documents and Settings\students\My Documents\Visual Studio 2005\Projects\BankAccountSS\BankAccountSS\BankDB.mdf"";Integrated Security=True;User Instance=True"))
SqlCommand cmd = new SqlCommand();
else
{
if (cmd.ExecuteNonQuery() > 0)
MessageBox.Show("เงินได้ถูกโอนไปยังบัญชีปลายทางเรียบร้อยแล้ว");
else{
MessageBox.Show("ระบบขัดข้อง");
}
}
แสดงบทความที่มีป้ายกำกับ C# แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ C# แสดงบทความทั้งหมด
วันพุธที่ 8 มีนาคม พ.ศ. 2560
C Language [ การประมวลผลไฟล์ เขียนข้อมูล การเปลี่ยนชื่อไฟล์]
หลักการประมวลผลไฟล์ การเขียนโปรแกรมในภาษาซี เพื่อประมวลผลกับไฟล์ หมายถึงการเขียนคำสั่งเพื่ออ่านข้อมูลจากไฟล์ หรือเขียนข้อมูลลงไฟล์นั้น ซึ่งเราควรจะเข้าใจหลักการทำงานของภาษาซี ในการประมวลผลกับไฟล์ก่อนที่จะเริ่มเขียนโปรแกรม โดยรูปต่อไปนี้แสดงขั้นตอนการประมวลผลระหว่างโปรแกรมภาษาซีกับไฟล์
การประมวลผลกับไฟล์เพื่ออ่านหรือเขียนข้อมูลนั้นจะไม่กระทำกับไฟล์โดยตรง แต่จะกระทำผ่านตัวกลางที่เรียกว่า บัฟเฟอร์ (Buffer) โดยบัฟเฟอร์คือพื้นที่ในหน่วยความจำหลักของเครื่องคอมพิวเตอร์ที่เครื่องจะ เตรียมไว้สำหรับประมวลผลกับไฟล์ ถ้าทำการประมวลผลกับหลายๆ ไฟล์ แต่ละไฟล์ก็จะมีบัฟเฟอร์เฉพาะสำหรับไฟล์นั้น อย่างเช่น ถ้าเราจะประมวลผลกับไฟล์ชื่อ A, B และ C พื้นที่ในหน่วยความจำจะถูกกำหนดแยกเอาไว้ 3 ส่วนด้วยกัน เพื่อให้เป็นบัฟเฟอร์ของไฟล์ A, B และ C
โครงสร้างของไฟล์ในภาษาซี จะเก็บข้อมูลในลักษณะเรียงต่อกันตั้งแต่ต้นจนจบไฟล์ ไม่มีการแบ่งช่วงของข้อมูล ดังนั้นการที่จะเลือกระบุข้อมูลใดๆ ก็ตามในไฟล์ได้นั้น เราจะต้องรู้ตำแหน่งของข้อมูล ซึ่งการระบุตำแหน่งของข้อมูลภายในไฟล์สามารถทำได้โดยใช้ตัวชี้ตำแหน่งไฟล์ (file pointer)
ตัวชี้ตำแหน่งไฟล์จะเป็นตัวบอกตำแหน่งภายในไฟล์ โดยจะเป็นตัวบอกว่าขณะนั้นทำการประมวลผลอยู่ ณ ตำแหน่งใดภายในไฟล์ ทำให้เราสามารถกำหนดได้ว่าจะอ่านหรือเขียนข้อมูลโดยเริ่มต้นจากจุดใดและไป สิ้นสุดที่ตำแหน่งใดในไฟล์ เมื่อเราทำการเปิดไฟล์ตัวชี้ตำแหน่งไฟล์จะถูกสร้างขึ้น โดยตัวชี้ตำแหน่งไฟล์จะชี้ไปที่จุดเริ่มต้นของไฟล์ที่ทำการเปิดนั้น เมื่ออ่านหรือเขียนข้อมูลจากไฟล์ตัวชี้ตำแหน่งไฟล์ก็จะเลื่อนไปเรื่อยๆ ตามจำนวนของข้อมูล
ในกรณีที่ประมวลผลกับหลายไฟล์ เมื่อทำการเปิดไฟล์ตัวชี้ตำแหน่งไฟล์จะถูกสร้างขึ้นเฉพาะสำหรับแต่ละไฟล์ พร้อมกับชี้ไปที่ตำแหน่งเริ่มต้นของไฟล์เหล่านั้น
9.2.1 เท็กซ์ไฟล์ (Text File) คือ ไฟล์ข้อมูลที่มีการเก็บข้อมูลเป็นบรรทัด เช่น ไฟล์ข้อความที่สร้างโดยโปรแกรมเอดิเตอร์ต่างๆ หรือไฟลืที่มีนามสกุล c , txt, bat เป็นต้น เท็กซ์ไฟล์จะถูกเก็บไว้ในหน่วยความจำสำรอง และเก็บในรูปแบบรหัสแอสกี ซึ่งก็คือไฟล์ตัวอักษร
9.2.2 ไบนารี่ไฟล์ (Binary File) คือ ไฟล์ที่มีการเก็บข้อมูลในรูปแบบเลขฐานสอง เช่น ไฟล์โปรแกรมต่างๆ ที่มีนามสกุล exe, com, obj เป็นต้น ดังนั้นเราจึงไม่สามารถอ่านข้อมูลในไฟล์ประเภทนี้ได้รู้เรื่อง
การเปิดไฟล์
ในการทำงานใดๆ กับไฟล์ไม่ว่าจะเป็นการอ่านข้อมูลจากไฟล์หรือเขียนข้อมูลลงไฟล์ สิ่งแรกที่ต้องกระทำก่อนก็คือ การเปิดไฟล์ โดยเมื่อทำการเปิดไฟล์ขึ้นมาแล้วตัวชี้ตำแหน่งไฟล์จะถูกสร้างขึ้นเพื่อชี้ ตำแหน่งภายในไฟล์นั้น ซึ่งตัวชี้ตำแหน่งไฟล์นี้เราจะนำไปใช้ในการอ่านหรือเขียนข้อมูลกับไฟล์
ในการเปิดไฟล์จะต้องใช้ 2 คำสั่งด้วยกัน โดยเริ่มจากคำสั่งแรกซึ่งเป็นคำสั่งสำหรบสร้างตัวแปรพอยน์เตอร์ชนิดไฟล์ สำหรับเก็บค่าของตัวชี้ตำแหน่งไฟล์ที่จะได้จากการเปิดไฟล์ ดังนี้
รูปแบบ
จากนั้นเราจะทำการเปิดไฟล์โดยเรียกใช้ฟังก์ชัน fopen() ซึ่งเป็นไลบรารี่ฟังก์ชันที่อยู่ในไฟล์ stdio.h ดังนั้นจึงต้องเขียนคำสั่ง #include <stdio.h> ไว้ที่ส่วนหัวของโปรแกรมด้วย รูปแบบของการเรียกใช้ฟังก์ชัน fopen() แสดงได้ดังนี้
รูปแบบ
การปิดไฟล์
หลังจากที่มีการอ่านหรือบันทึกแฟ้มข้อมูลเสร็จแล้ว จะต้องมีการปิดแฟ้มข้อมูลเสมอ การปิดแฟ้มจะเกิดการนำข้อมูลออกจากอินพุตบัฟเฟอร์หรือเอาท์พุตบัฟเฟอร์ให้หมด เพื่อไม่ให้ข้อมูลหายจากระบบ ในภาษาซีมีฟังก์ชัน 2 ฟังก์ชันที่ใช้ในการปิดแฟ้มข้อมูล คือ fclose ( ) และ fcloseall ( )
9.4.1 ฟังก์ชัน fclose( ) ฟังก์ชัน fclose( ) ถูกนิยามไว้ในแฟ้ม stdio.h ฟังก์ชันนี้จะทำหน้าที่ปิดแฟ้มข้อมูลที่กำหนดโดยมีการบันทึกข้อมูลใน บัฟเฟอร์ทั้งหมดเก็บเข้าแฟ้ม แล้วจะยกเลิกการใช้บัฟเฟอร ์ทำให้มีเนื้อที่เปิดแฟ้มใหม่เพิ่มได้อีก ถ้าปิดแฟ้มข้อมูลสำเร็จจะส่งกลับเป็น NULL หรือ 0 ถ้ามีข้อผิดพลาดจะส่งค่ากลับเป็น EOF
รูปแบบ
9.4.2 ฟังก์ชัน fcloseall ( ) ฟังก์ชัน fcloseall ( ) ถูกนิยามไว้ในแฟ้ม stdio.h ฟังก์ชันนี้จะปิดแฟ้มข้อมูลทั้งหมดที่ได้เปิดไว้ และให้ค่ากลับมายังฟังก์ชันเป็นจำนวนแฟ้มที่ถูกปิด ถ้ามีข้อผิดพลาดจะให้ค่ากลับเป็น EOF
รูปแบบ
อ่านข้อมูลจากไฟล์
เมื่อเราเขียนโปรแกรมเพื่ออ่านข้อมูลจากไฟล์ ข้อมูลภายในไฟล์จะถูกอ่านเริ่มตั้งแต่ตรงที่ตัวชี้ตำแหน่งไฟล์ชี้อยู่ไปจนครบตามจำนวนที่กำหนด หรือจนจบไฟล์ ซึ่งตัวชี้ตำแหน่งไฟล์ก็จะเลื่อนตามไปเรื่อยๆ ตามข้อมูลที่อ่าน ข้อมูลส่วนที่อ่านมาจากไฟล์จะถูกนำไปเก็บไว้ที่บัฟเฟอร์ ดังนั้นจริงๆ แล้วโปรแกรมที่เราเขียนนั้นอ่านข้อมูลมาจากบัฟเฟอร์อีกทีหนึ่ง ไม่ใช่จากไฟล์โดยตรง ซึ่งฟังก์ชันที่ใช้ในการอ่านข้อมูลจากไฟล์มีดังนี้
9.5.1 อ่านข้อมูลทีละอักขระด้วย getc()
9.5.2 อ่านข้อมูลทีละอักขระด้วย fgetc()
9.5.3 อ่านข้อมูลเป็นข้อความด้วย fgets()
9.5.4 อ่านข้อมูลตามรูปแบบด้วย fscanf()
9.5.5 อ่านข้อมูลทีละเรคคอร์ดด้วย fread()
9.5.1 อ่านข้อมูลทีละอักขระด้วย getc() ฟังก์ชัน getc( ) ใช้ในการอ่านข้อมูลชนิดอักขระจากไฟล์ โดยจะอ่านออกมาทีละ 1 อักขระเท่านั้น ซึ่งถูกนิยามไว้ในแฟ้ม stdio.h และมีรูปแบบการใช้งานดังนี้
รูปแบบ
9.5.2 อ่านข้อมูลทีละอักขระด้วย fgetc() ฟังก์ชัน fgetc( ) เป็นฟังก์ชันที่ถูกนิยามไว้ในแฟ้ม stdio.h ใช้ในการอ่านข้อมูลชนิดอักขระจากไฟล์ เช่นเดียวกันกับฟังก์ชัน getc() โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
9.5.3 อ่านข้อมูลเป็นข้อความด้วย fgets() ฟังก์ชัน fgets( ) เป็นฟังก์ชันที่ถูกนิยามไว้ในแฟ้ม stdio.h จะใช้ในกรณีที่ต้องการอ่านข้อมูลจากไฟล์ออกมาต่อเนื่องกันเป็นข้อความ โดยสามารถกำหนดความยาวของข้อความได้ ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
9.5.4 อ่านข้อมูลตามรูปแบบด้วย fscanf() จากที่ผ่านมาการอ่านข้อมูลจากไฟล์ จะอ่านได้เฉพาะข้อมูลที่เป็นอักขระและข้อมูลที่เป็นข้อความเท่านั้น ในกรณีที่ต้องการอ่านข้อมูลชนิดอื่นๆ เราสามารถเรียกใช้ฟังก์ชัน fscanf () ได้ ซึ่งฟังก์ชัน fscanf ( ) จะใช้อ่านข้อมูลจากไฟล์ โดยสามารถเลือกกำหนดชนิดของข้อมูลที่จะอ่านได้ รูปแบบการใช้ฟังก์ชัน fscanf () ซึ่งคล้ายกับฟังก์ชัน scanf () โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
9.5.5 อ่านข้อมูลทีละเรคคอร์ดด้วย fread() ฟังก์ชัน fread () ใช้ในการอ่านข้อมูลจากไฟล์มาเก็บไว้ในหน่วยความจำ ณ ตำแหน่งที่เรากำหนด โดยฟังก์ชัน fread () จะอ่านข้อมูลออกมาเป็นหน่วยเรคคอร์ดหรือเป็นชุด ซึ่งขนาดของเรคคอร์ดหรือชุดนั้นเราจะเป็นผู้กำหนดขึ้นเองในหน่วยที่เป็นไบต์ โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
ดังนั้น ถ้าเขียนคำสั่งเพื่อเรียกใช้ฟังก์ชัน fread () อ่านข้อมูลจากไฟล์ ดังนี้
fread (&name, 15 , 1, fp);
จะหมายถึง ให้ทำการอ่านข้อมูลมาเก็บไว้ที่หน่วยความจำในตำแหน่งของตัวแปร name ทำให้ต่อไปเมื่อจะใช้งานข้อมูลที่อ่านมาก็สามารถเรียกใช้ผ่านตัวแปร name ได้ทันที
เขียนข้อมูลลงในไฟล์
เมื่อเราเขียนโปรแกรมเพื่อเขียนข้อมูลลงในไฟล์ ข้อมูลเหล่านั้นจะถูกเขียนลงในบัฟเฟอร์ก่อน ในระหว่างที่เขียนข้อมูลนั้นี่ตัวชี้ตำแหน่งไฟล์จะเลื่อนตำแหน่งชี้ไป เรื่อยๆ ตามปริมาณของข้อมูลที่ทำการเขียน เมื่อบัฟเฟอร์เต็มหรือทำการปิดไฟล์ข้อมูลเหล่านั้นจึงจะถูกเขียนลงไปในไฟล์ จริงๆ ฟังก์ชันที่ใช้ในการเขียนข้อมูลลงไฟล์มีดังนี้
9.6.1 เขียนข้อมูลทีละอักขระด้วย putc()
9.6.2 เขียนข้อมูลทีละอักขระด้วย fputc()
9.6.3 เขียนข้อมูลเป็นข้อความด้วย fputs()
9.6.4 เขียนข้อมูลตามรูปแบบด้วย fprintf()
9.6.5 เขียนข้อมูลทีละเรคคอร์ดด้วย fwrite()
9.6.1 เขียนข้อมูลทีละอักขระด้วย putc() ฟังก์ชัน putc( ) ถูกนิยามไว้ในแฟ้ม stdio.h ซึ่งใช้สำหรับเขียนข้อมูลชนิดอักขระลงในไฟล์ทีละ 1 อักขระเท่านั้น โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
9.6.2 เขียนข้อมูลทีละอักขระด้วย fputc() ฟังก์ชัน fputc( ) เป็นฟังก์ชันที่ถูกนิยามไว้ในแฟ้ม stdio.h ใช้ในการเขียนข้อมูลชนิดอักขระลงในไฟล์ทีละ 1 อักขระ เช่นเดียวกันกับฟังก์ชัน getc() โดยรูปแบบการเรียกใช้รวมถึงการนำไปใช้งานเหมือนกันทุกอย่าง สามารถใช้แทนกันได้ ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
9.6.3 เขียนข้อมูลเป็นข้อความด้วย fputs() ฟังก์ชัน fputs( ) เป็นฟังก์ชันที่ถูกนิยามไว้ในแฟ้ม stdio.h จะใช้ในกรณีที่ต้องการเขียนข้อมูลประเภทข้อความลงไฟล์ ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
9.6.4 เขียนข้อมูลตามรูปแบบด้วย fprintf() นอกจากการเขียนอักขระและข้อความลงในไฟล์แล้ว ข้อมูลชนิดอื่นอย่างเช่นตัวเลข ก็สามารถเขียนลงในไฟล์ได้เช่นกัน ด้วยฟังก์ชัน fprintf () ซึ่งใช้สำหรับเขียนข้อมูลลงในไฟล์ โดยสามารถกำหนดชนิดของข้อมูลที่ต้องการได้ รูปแบบการเรียกใช้จะมีลักษณะคล้ายกับฟังก์ชัน printf () โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
9.6.5 เขียนข้อมูลทีละเรคคอร์ดด้วย fwrite() ฟังก์ชัน fwrite () จะทำงานตรงกันข้ามกับฟังก์ชัน fread () โดยฟังก์ชัน fwrite () ใช้สำหรับเขียนข้อมูลจากตำแหน่งในหน่วยความจำลงไปในไฟล์ โดยในการเขียนข้อมูลจะใช้หน่วยเรคคอร์ด ซึ่งเราเป็นผู้กำหนดขนาดของแต่ละเรคคอร์ดและจำนวนเรคคอร์ดของข้อมูลที่จะ เขียนลงในไฟล์เอง โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
ตัวชี้ตำแหน่งไฟล์
เมื่อเปิดไฟล์ได้สำเร็จ ตัวชี้ตำแหน่งไฟล์จะถูกกำหนดให้ชี้ไปยังข้อมูลแรกของไฟล์ และโดยปกติทุกครั้งหลังจากการเขียนหรืออ่านข้อมูลแต่ละครั้ง ตัวชี้ตำแหน่งไฟล์จะเลื่อนไปยังข้อมูลถัดไปโดยอัตโนมัติ แต่ในภาษาซียังมีฟังก์ชันอีกกลุ่มหนึ่งที่ใช้ควบคุมตัวชี้ตำแหน่งไฟล์ตามต้องการ ซึ่งฟังก์ชันกลุ่มนี้ประกอบไปด้วย
9.7.1 กำหนดตำแหน่งไปที่จุดเริ่มต้นไฟล์ด้วย rewind ()
9.7.2 หาค่าตำแหน่งของตัวชี้ตำแหน่งด้วย ftell ()
9.7.3 ย้ายตำแหน่งตัวชี้ด้วย fseek ()
9.7.1 กำหนดตำแหน่งไปที่จุดเริ่มต้นไฟล์ด้วย rewind () ฟังก์ชัน rewind () ใช้ในการเลื่อนตัวชี้ตำแหน่งไฟล์ให้กลับไปที่จุดเริ่มต้นไฟล์ โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
9.7.2 หาค่าตำแหน่งของตัวชี้ตำแหน่งด้วย ftell () ในกรณีที่ต้องการจะรู้ตำแหน่งปัจจุบันในไฟล์ที่ตัวชี้ตำแหน่งไฟล์ทำการชี้อยู่ สามารถทำได้โดยเรียกใช้ฟังก์ชัน ftell ( ) ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
9.7.3 ย้ายตำแหน่งตัวชี้ด้วย fseek () ฟังก์ชัน fseek ( ) เป็นฟังก์ชันที่ถูกนิยามไว้ในแฟ้ม stdio.h จะใช้ในการย้ายตัวชี้ตำแหน่งไฟล์ไปยังตำแหน่งที่ต้องการภายในไฟล์ได้ ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
เช่น fseek (f1, 0L, 0) หมายถึง เป็นการเลื่อนตัวชี้ตำแหน่งไฟล์ไปที่จุดเริ่มต้นของไฟล์
การลบไฟล์
ในกรณีที่ไม่ต้องการใช้งานไฟล์ใดแล้ว สามารถลบทิ้งได้โดยใช้ฟังก์ชัน remove () ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
เมื่อเรียกใช้ฟังก์ชัน remove () ทำการเปลี่ยนลบไฟล์แล้ว ค่าที่ได้กลับจากฟังก์ชันจะเป็นผลการทำงาน โดยถ้าสามารถลบไฟล์ได้สำเร็จจะให้ค่าเป็น 0 แต่ถ้าไม่สามารถลบไฟล์ได้ ค่าที่ได้กลับมาจะไม่ใช่ 0 ดังตัวอย่าง
ตัวอย่าง โปรแกรมแสดงการทำงานของฟังก์ชัน remove ()
โปรแกรมข้างต้นจะทำการลบไฟล์ที่ชื่อ file1.txt ซึ่งอยู่ที่ไดร์ฟ A: โดยถ้าสามารถลบได้จะแสดงข้อความว่า Success แต่ถ้าไม่สามารถลบได้ จะแสดงข้อความว่า Fail
การเปลี่ยนชื่อไฟล์
ในกรณีที่ต้องการเปลี่ยนชื่อของไฟล์ สามารถทำได้โดยใช้ฟังก์ชัน rename () ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
เมื่อเรียกใช้ฟังก์ชัน rename () ทำการเปลี่ยนชื่อไฟล์แล้ว ค่าที่ได้กลับจากฟังก์ชันจะเป็นผลการทำงาน โดยถ้าสามารถเปลี่ยนชื่อไฟล์ได้สำเร็จจะให้ค่าเป็น 0 แต่ถ้าไม่สามารถเปลี่ยนชื่อไฟล์ได้ ค่าที่ได้กลับมาจะไม่ใช่ 0 ดังตัวอย่าง
ตัวอย่าง โปรแกรมแสดงการทำงานของฟังก์ชัน rename ()
โปรแกรมข้างต้นจะทำการเปลี่ยนชื่อไฟล์ที่ชื่อ file1.txt ซึ่งอยู่ที่ไดร์ฟ A: ให้เป็นชื่อ filea.txt โดยถ้าสามารถเปลี่ยนได้จะแสดงข้อความว่า Success แต่ถ้าไม่สามารถเปลี่ยนชื่อได้ จะแสดงข้อความว่า Fail
การประมวลผลกับไฟล์เพื่ออ่านหรือเขียนข้อมูลนั้นจะไม่กระทำกับไฟล์โดยตรง แต่จะกระทำผ่านตัวกลางที่เรียกว่า บัฟเฟอร์ (Buffer) โดยบัฟเฟอร์คือพื้นที่ในหน่วยความจำหลักของเครื่องคอมพิวเตอร์ที่เครื่องจะ เตรียมไว้สำหรับประมวลผลกับไฟล์ ถ้าทำการประมวลผลกับหลายๆ ไฟล์ แต่ละไฟล์ก็จะมีบัฟเฟอร์เฉพาะสำหรับไฟล์นั้น อย่างเช่น ถ้าเราจะประมวลผลกับไฟล์ชื่อ A, B และ C พื้นที่ในหน่วยความจำจะถูกกำหนดแยกเอาไว้ 3 ส่วนด้วยกัน เพื่อให้เป็นบัฟเฟอร์ของไฟล์ A, B และ C
โครงสร้างของไฟล์ในภาษาซี จะเก็บข้อมูลในลักษณะเรียงต่อกันตั้งแต่ต้นจนจบไฟล์ ไม่มีการแบ่งช่วงของข้อมูล ดังนั้นการที่จะเลือกระบุข้อมูลใดๆ ก็ตามในไฟล์ได้นั้น เราจะต้องรู้ตำแหน่งของข้อมูล ซึ่งการระบุตำแหน่งของข้อมูลภายในไฟล์สามารถทำได้โดยใช้ตัวชี้ตำแหน่งไฟล์ (file pointer)
ตัวชี้ตำแหน่งไฟล์จะเป็นตัวบอกตำแหน่งภายในไฟล์ โดยจะเป็นตัวบอกว่าขณะนั้นทำการประมวลผลอยู่ ณ ตำแหน่งใดภายในไฟล์ ทำให้เราสามารถกำหนดได้ว่าจะอ่านหรือเขียนข้อมูลโดยเริ่มต้นจากจุดใดและไป สิ้นสุดที่ตำแหน่งใดในไฟล์ เมื่อเราทำการเปิดไฟล์ตัวชี้ตำแหน่งไฟล์จะถูกสร้างขึ้น โดยตัวชี้ตำแหน่งไฟล์จะชี้ไปที่จุดเริ่มต้นของไฟล์ที่ทำการเปิดนั้น เมื่ออ่านหรือเขียนข้อมูลจากไฟล์ตัวชี้ตำแหน่งไฟล์ก็จะเลื่อนไปเรื่อยๆ ตามจำนวนของข้อมูล
ในกรณีที่ประมวลผลกับหลายไฟล์ เมื่อทำการเปิดไฟล์ตัวชี้ตำแหน่งไฟล์จะถูกสร้างขึ้นเฉพาะสำหรับแต่ละไฟล์ พร้อมกับชี้ไปที่ตำแหน่งเริ่มต้นของไฟล์เหล่านั้น
ประเภทของไฟล์
ไฟล์ข้อมูลสามารถแบ่งออกได้เป็น 2 ประเภทด้วยกัน ดังนี้9.2.1 เท็กซ์ไฟล์ (Text File) คือ ไฟล์ข้อมูลที่มีการเก็บข้อมูลเป็นบรรทัด เช่น ไฟล์ข้อความที่สร้างโดยโปรแกรมเอดิเตอร์ต่างๆ หรือไฟลืที่มีนามสกุล c , txt, bat เป็นต้น เท็กซ์ไฟล์จะถูกเก็บไว้ในหน่วยความจำสำรอง และเก็บในรูปแบบรหัสแอสกี ซึ่งก็คือไฟล์ตัวอักษร
9.2.2 ไบนารี่ไฟล์ (Binary File) คือ ไฟล์ที่มีการเก็บข้อมูลในรูปแบบเลขฐานสอง เช่น ไฟล์โปรแกรมต่างๆ ที่มีนามสกุล exe, com, obj เป็นต้น ดังนั้นเราจึงไม่สามารถอ่านข้อมูลในไฟล์ประเภทนี้ได้รู้เรื่อง
การเปิดไฟล์
ในการทำงานใดๆ กับไฟล์ไม่ว่าจะเป็นการอ่านข้อมูลจากไฟล์หรือเขียนข้อมูลลงไฟล์ สิ่งแรกที่ต้องกระทำก่อนก็คือ การเปิดไฟล์ โดยเมื่อทำการเปิดไฟล์ขึ้นมาแล้วตัวชี้ตำแหน่งไฟล์จะถูกสร้างขึ้นเพื่อชี้ ตำแหน่งภายในไฟล์นั้น ซึ่งตัวชี้ตำแหน่งไฟล์นี้เราจะนำไปใช้ในการอ่านหรือเขียนข้อมูลกับไฟล์
ในการเปิดไฟล์จะต้องใช้ 2 คำสั่งด้วยกัน โดยเริ่มจากคำสั่งแรกซึ่งเป็นคำสั่งสำหรบสร้างตัวแปรพอยน์เตอร์ชนิดไฟล์ สำหรับเก็บค่าของตัวชี้ตำแหน่งไฟล์ที่จะได้จากการเปิดไฟล์ ดังนี้
รูปแบบ
FILE *fp;
|
| โดยที่ | FILE | หมายถึง | สำหรับสร้างตัวแปรชนิดไฟล์ ซึ่งต้องเขียนเป็นตัวพิมพ์ใหญ่ทั้งหมด |
| fp | หมายถึง | ชื่อของตัวแปรที่จะสร้างขึ้นเพื่อเก็บค่าของตัวชี้ตำแหน่งไฟล์ ซึ่งจะต้องตามหลังีเครื่องหมาย * เพื่อบอกว่าเป็นตัวแปรประเภทพอยน์เตอร์ |
จากนั้นเราจะทำการเปิดไฟล์โดยเรียกใช้ฟังก์ชัน fopen() ซึ่งเป็นไลบรารี่ฟังก์ชันที่อยู่ในไฟล์ stdio.h ดังนั้นจึงต้องเขียนคำสั่ง #include <stdio.h> ไว้ที่ส่วนหัวของโปรแกรมด้วย รูปแบบของการเรียกใช้ฟังก์ชัน fopen() แสดงได้ดังนี้
รูปแบบ
fp = fopen("name","mode");
|
| โดยที่ | fp | หมายถึง | ตัวแปรที่สร้างขึ้นเพื่อเก็บค่าของตัวชี้ตำแหน่งไฟล์ |
| name | หมายถึง | ชื่อของไฟล์ที่จะทำการเปิด | |
| mode | หมายถึง | โหมดของไฟล์ โดยโหมดของไฟล์จะเป็นตัวบอกว่าเราต้องการเปิดไฟล์เพื่อวัตถุประสงค์ใด ซึ่งมีโหมดในการเปิดไฟล์ดังนี้ |
โหมดของเท็กซ์ไฟล์
|
โหมดของไบนารีไฟล์
|
ความหมาย
|
r
|
rb
| เปิดไฟล์เพื่ออ่านข้อมูลจากไฟล์ที่ถูกสร้างไว้แล้วเพียงอย่างเดียว ไม่สามารถเขียนข้อมูลลงไปในไฟล์ได้ |
w
|
wb
| เปิดไฟล์เพื่อสำหรับเขียนข้อมูล โดยถ้าไฟล์นั้นไม่มีอยู่ เครื่องจะทำการสร้างไฟล์ขึ้นมาใหม่ แต่ถ้ามีไฟล์อยู่แล้วข้อมูลเก่าจะถูกลบทิ้งแล้วแทนที่ด้วยข้อมูลใหม่ |
a
|
ab
| เปิดไฟล์สำหรับเขียนข้อมูลต่อท้ายลงไปในไฟล์ ที่ถูกสร้างไว้แล้ว |
r+
|
r+b
| เปิดไฟล์สำหรับอ่านและเขียนข้อมูลลงในไฟล์ที่ถูกสร้างไว้แล้ว |
w+
|
w+b
| เปิดไฟล์สำหรับอ่านและเขียนข้อมูลทับ โดยเครื่องจะทำการสร้างไฟล์ขึ้นมาใหม่ ถ้าไฟล์ที่ต้องการเปิดยังไม่มี |
a+
|
a+b
| เปิดไฟล์สำหรับเขียนข้อมูลต่อท้ายลงไปในไฟล์ โดยถ้าไฟล์นั้นไม่มีอยู่ เครื่องจะทำการสร้างไฟล์ขึ้นมาใหม่ |
การปิดไฟล์
หลังจากที่มีการอ่านหรือบันทึกแฟ้มข้อมูลเสร็จแล้ว จะต้องมีการปิดแฟ้มข้อมูลเสมอ การปิดแฟ้มจะเกิดการนำข้อมูลออกจากอินพุตบัฟเฟอร์หรือเอาท์พุตบัฟเฟอร์ให้หมด เพื่อไม่ให้ข้อมูลหายจากระบบ ในภาษาซีมีฟังก์ชัน 2 ฟังก์ชันที่ใช้ในการปิดแฟ้มข้อมูล คือ fclose ( ) และ fcloseall ( )
9.4.1 ฟังก์ชัน fclose( ) ฟังก์ชัน fclose( ) ถูกนิยามไว้ในแฟ้ม stdio.h ฟังก์ชันนี้จะทำหน้าที่ปิดแฟ้มข้อมูลที่กำหนดโดยมีการบันทึกข้อมูลใน บัฟเฟอร์ทั้งหมดเก็บเข้าแฟ้ม แล้วจะยกเลิกการใช้บัฟเฟอร ์ทำให้มีเนื้อที่เปิดแฟ้มใหม่เพิ่มได้อีก ถ้าปิดแฟ้มข้อมูลสำเร็จจะส่งกลับเป็น NULL หรือ 0 ถ้ามีข้อผิดพลาดจะส่งค่ากลับเป็น EOF
รูปแบบ
fclose (fp);
|
| โดยที่ | fp | หมายถึง | ชื่อของตัวแปรที่จะสร้างขึ้นเพื่อเก็บค่าของตัวชี้ตำแหน่งไฟล์ ซึ่งจะต้องตามหลังีเครื่องหมาย * เพื่อบอกว่าเป็นตัวแปรประเภทพอยน์เตอร์ |
9.4.2 ฟังก์ชัน fcloseall ( ) ฟังก์ชัน fcloseall ( ) ถูกนิยามไว้ในแฟ้ม stdio.h ฟังก์ชันนี้จะปิดแฟ้มข้อมูลทั้งหมดที่ได้เปิดไว้ และให้ค่ากลับมายังฟังก์ชันเป็นจำนวนแฟ้มที่ถูกปิด ถ้ามีข้อผิดพลาดจะให้ค่ากลับเป็น EOF
รูปแบบ
fcloseall ();
|
เมื่อเราเขียนโปรแกรมเพื่ออ่านข้อมูลจากไฟล์ ข้อมูลภายในไฟล์จะถูกอ่านเริ่มตั้งแต่ตรงที่ตัวชี้ตำแหน่งไฟล์ชี้อยู่ไปจนครบตามจำนวนที่กำหนด หรือจนจบไฟล์ ซึ่งตัวชี้ตำแหน่งไฟล์ก็จะเลื่อนตามไปเรื่อยๆ ตามข้อมูลที่อ่าน ข้อมูลส่วนที่อ่านมาจากไฟล์จะถูกนำไปเก็บไว้ที่บัฟเฟอร์ ดังนั้นจริงๆ แล้วโปรแกรมที่เราเขียนนั้นอ่านข้อมูลมาจากบัฟเฟอร์อีกทีหนึ่ง ไม่ใช่จากไฟล์โดยตรง ซึ่งฟังก์ชันที่ใช้ในการอ่านข้อมูลจากไฟล์มีดังนี้
9.5.1 อ่านข้อมูลทีละอักขระด้วย getc()
9.5.2 อ่านข้อมูลทีละอักขระด้วย fgetc()
9.5.3 อ่านข้อมูลเป็นข้อความด้วย fgets()
9.5.4 อ่านข้อมูลตามรูปแบบด้วย fscanf()
9.5.5 อ่านข้อมูลทีละเรคคอร์ดด้วย fread()
9.5.1 อ่านข้อมูลทีละอักขระด้วย getc() ฟังก์ชัน getc( ) ใช้ในการอ่านข้อมูลชนิดอักขระจากไฟล์ โดยจะอ่านออกมาทีละ 1 อักขระเท่านั้น ซึ่งถูกนิยามไว้ในแฟ้ม stdio.h และมีรูปแบบการใช้งานดังนี้
รูปแบบ
variable = getc(fp);
|
| โดยที่ | variable | หมายถึง | ตัวแปรชนิด char เพื่อใช้เก็บค่าของตัวอักขระที่อ่านออกมาจากไฟล์ |
| fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
variable = fgetc(fp);
|
| โดยที่ | variable | หมายถึง | ตัวแปรชนิด char เพื่อใช้เก็บค่าของตัวอักขระที่อ่านออกมาจากไฟล์ |
| fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fgets (variable, total, fp);
|
| โดยที่ | variable | หมายถึง | ตัวแปรชุดชนิด char เพื่อใช้เก็บข้อความที่อ่านออกมาจากไฟล์ |
| total | หมายถึง | ความยาวของข้อความที่ต้องการอ่านจากไฟล์ โดยจำนวนที่เรากำหนดจะถูกลบออกหนึ่งเพื่อใช้สำหรับ \0 ปิดท้าย | |
| fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fscanf (fp, "format", &variable);
|
| โดยที่ | fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
| format | หมายถึง | รูปแบบที่ใช้ในการอ่านข้อมูล จากไฟล์ ซึ่งจะเป็นแบบเดียวกับฟังก์ชัน scanf () | |
| variable | หมายถึง | ตัวแปรชุดชนิด char เพื่อใช้เก็บข้อความที่อ่านออกมาจากไฟล์ |
รูปแบบ
fread (ptr, size, total, fp);
|
| โดยที่ | ptr | หมายถึง | ค่าตำแหน่งในหน่วยความจำ ซึ่งจะนำข้อมูลที่อ่านได้มาเก็บไว้ |
| size | หมายถึง | ขนาดของเรคคอร์ด โดยมีหน่วยเป็นไบต์ | |
| total | หมายถึง | จำนวนเรคคอร์ดหรือชุดของข้อมูลที่จะอ่าน | |
| fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
fread (&name, 15 , 1, fp);
จะหมายถึง ให้ทำการอ่านข้อมูลมาเก็บไว้ที่หน่วยความจำในตำแหน่งของตัวแปร name ทำให้ต่อไปเมื่อจะใช้งานข้อมูลที่อ่านมาก็สามารถเรียกใช้ผ่านตัวแปร name ได้ทันที
เขียนข้อมูลลงในไฟล์
เมื่อเราเขียนโปรแกรมเพื่อเขียนข้อมูลลงในไฟล์ ข้อมูลเหล่านั้นจะถูกเขียนลงในบัฟเฟอร์ก่อน ในระหว่างที่เขียนข้อมูลนั้นี่ตัวชี้ตำแหน่งไฟล์จะเลื่อนตำแหน่งชี้ไป เรื่อยๆ ตามปริมาณของข้อมูลที่ทำการเขียน เมื่อบัฟเฟอร์เต็มหรือทำการปิดไฟล์ข้อมูลเหล่านั้นจึงจะถูกเขียนลงไปในไฟล์ จริงๆ ฟังก์ชันที่ใช้ในการเขียนข้อมูลลงไฟล์มีดังนี้
9.6.1 เขียนข้อมูลทีละอักขระด้วย putc()
9.6.2 เขียนข้อมูลทีละอักขระด้วย fputc()
9.6.3 เขียนข้อมูลเป็นข้อความด้วย fputs()
9.6.4 เขียนข้อมูลตามรูปแบบด้วย fprintf()
9.6.5 เขียนข้อมูลทีละเรคคอร์ดด้วย fwrite()
9.6.1 เขียนข้อมูลทีละอักขระด้วย putc() ฟังก์ชัน putc( ) ถูกนิยามไว้ในแฟ้ม stdio.h ซึ่งใช้สำหรับเขียนข้อมูลชนิดอักขระลงในไฟล์ทีละ 1 อักขระเท่านั้น โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
putc (ch, fp);
|
| โดยที่ | ch | หมายถึง | อักขระ 1 ตัวซึ่งอาจจะอยู่ในรูปแบบของอักขระจริงๆ (เขียนภายในเครื่องหมาย ' ' ) หรือตัวแปรชนิด char ที่เก็บอักขระเอาไว้ก็ได้ |
| fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fputc (ch, fp);
|
| โดยที่ | ch | หมายถึง | อักขระ 1 ตัวซึ่งอาจจะอยู่ในรูปแบบของอักขระจริงๆ (เขียนภายในเครื่องหมาย ' ' ) หรือตัวแปรชนิด char ที่เก็บอักขระเอาไว้ก็ได้ |
| fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fputs (str, fp);
|
| โดยที่ | str | หมายถึง | ข้อความที่ต้องการเขียนลงในไฟล์ โดยอาจจะเป็นข้อความที่เขียนภายในเครื่องหมาย " " หรือตัวแปรที่เก็บข้อความเอาไว้ก็ได้เช่นกัน |
| fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fscanf (fp, "control", value);
|
| โดยที่ | fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
| control | หมายถึง | ส่วนที่ใช้ควบคุมรูปแบบของข้อมูลที่จะเขียนลงในไฟล์ ซึ่งมีการใช้งานเหมือนฟังก์ชัน printf () | |
| value | หมายถึง | ค่าของตัวแปร หรือนิพจน์ ที่ต้องการเขียนลงในไฟล์ โดยถ้ามีมากกว่าหนึ่งตัว ให้ใช้เครื่องหมาย , (comma) คั่นระหว่างแต่ละตัว |
รูปแบบ
fwrite (ptr, size, total, fp);
|
| โดยที่ | ptr | หมายถึง | ตำแหน่งในหน่วยความจำของข้อมูลที่จะเขียนลงในไฟล์ |
| size | หมายถึง | ขนาดของเรคคอร์ด โดยมีหน่วยเป็นไบต์ | |
| total | หมายถึง | จำนวนเรคคอร์ดหรือชุดของข้อมูลที่ต้องการเขียนลงในไฟล์ | |
| fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
ตัวชี้ตำแหน่งไฟล์
เมื่อเปิดไฟล์ได้สำเร็จ ตัวชี้ตำแหน่งไฟล์จะถูกกำหนดให้ชี้ไปยังข้อมูลแรกของไฟล์ และโดยปกติทุกครั้งหลังจากการเขียนหรืออ่านข้อมูลแต่ละครั้ง ตัวชี้ตำแหน่งไฟล์จะเลื่อนไปยังข้อมูลถัดไปโดยอัตโนมัติ แต่ในภาษาซียังมีฟังก์ชันอีกกลุ่มหนึ่งที่ใช้ควบคุมตัวชี้ตำแหน่งไฟล์ตามต้องการ ซึ่งฟังก์ชันกลุ่มนี้ประกอบไปด้วย
9.7.1 กำหนดตำแหน่งไปที่จุดเริ่มต้นไฟล์ด้วย rewind ()
9.7.2 หาค่าตำแหน่งของตัวชี้ตำแหน่งด้วย ftell ()
9.7.3 ย้ายตำแหน่งตัวชี้ด้วย fseek ()
9.7.1 กำหนดตำแหน่งไปที่จุดเริ่มต้นไฟล์ด้วย rewind () ฟังก์ชัน rewind () ใช้ในการเลื่อนตัวชี้ตำแหน่งไฟล์ให้กลับไปที่จุดเริ่มต้นไฟล์ โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
rewind (fp);
|
| โดยที่ | fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
ftell (fp);
|
| โดยที่ | fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fseek (fp, offset, referent);
|
| โดยที่ | fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
| referent | หมายถึง | ตำแหน่งอ้างอิงในการเลื่อนตัวชี้ตำแหน่งไฟล์ ซึ่งมีอยู่ 3 แบบด้วยกัน คือ SEEK_SET : ตำแหน่งเริ่มต้นไฟล์ SEEK_CUR : ตำแหน่งปัจจุบันที่ตัวชี้ตำแหน่งไฟล์อยู่ SEEK_END : ตำแหน่งจบไฟล์ | |
| offset | หมายถึง | จำนวนไบต์ที่ต้องการเลื่อนตัวชี้ตำแหน่งไฟล์ |
การลบไฟล์
ในกรณีที่ไม่ต้องการใช้งานไฟล์ใดแล้ว สามารถลบทิ้งได้โดยใช้ฟังก์ชัน remove () ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
remove (name);
|
| โดยที่ | name | หมายถึง | ชื่อไฟล์ที่ต้องการจะลบ |
ตัวอย่าง โปรแกรมแสดงการทำงานของฟังก์ชัน remove ()
| #include <stdio.h> main() { int result; result = remove ( "a:/file1.txt" ); if ( !result ) { printf ( "Success" ); } else { printf ( "Fail" ); } } |
การเปลี่ยนชื่อไฟล์
ในกรณีที่ต้องการเปลี่ยนชื่อของไฟล์ สามารถทำได้โดยใช้ฟังก์ชัน rename () ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
remove (old, new);
|
| โดยที่ | old | หมายถึง | ชื่อไฟล์เดิมที่ต้องการจะเปลี่ยนชื่อ |
| new | หมายถึง | ชื่อไฟล์ใหม่ทีจะเปลี่ยนไปใช้ |
ตัวอย่าง โปรแกรมแสดงการทำงานของฟังก์ชัน rename ()
| #include <stdio.h> main() { int result; result = rename ( "a:/file1.txt", "a:/filea.txt" ); if ( !result ) { printf ( "Success" ); } else { printf ( "Fail" ); } } |
โปรแกรมข้างต้นจะทำการเปลี่ยนชื่อไฟล์ที่ชื่อ file1.txt ซึ่งอยู่ที่ไดร์ฟ A: ให้เป็นชื่อ filea.txt โดยถ้าสามารถเปลี่ยนได้จะแสดงข้อความว่า Success แต่ถ้าไม่สามารถเปลี่ยนชื่อได้ จะแสดงข้อความว่า Fail
สมัครสมาชิก:
บทความ (Atom)
Search Table Name of all database [ ค้นหาชือ Table ใน Database server ทั้งหมด ]
-------------- -- Search Table Name inside database server -- 1. -------------- DECLARE @SearchTerm NVARCHAR ( 100 ) = '% TableN...
-
หลักการประมวลผลไฟล์ การเขียนโปรแกรมในภาษาซี เพื่อประมวลผลกับไฟล์ หมายถึงการเขียนคำสั่งเพื่ออ่านข้อมูลจากไฟล์ หรือเขียนข้อมูลลงไฟล์นั้...
-
วิธีแก้ 1. ไปที่ Control Panel 2. ที่มุมขวาบน เลือก View by : category 3. ที่หัวข้อ Programs เลือก Uninstall a program 4. ที่แถบซ้าย...
-
Ex. 1 การคูณ .model small .stack 100h .data X equ 3 Y equ 3 Z equ 2 .code ;X+Y-2Z+1 Main pro...