การรับและแสดงผลข้อมูลของภาษา C อาจารย์สมเกียรติ ช่อเหมือน สาขาวิชาวิศวกรรมซอฟต์แวร์ คณะวิทยาศาสตร์และเทคโนโลยี (tko@webmail.npru.ac.th)
เนื้อหาที่สนใจ • • • • •
การรับและแสดงผลด้วยภาษาซี (Input & Output) การรับและแสดงผลไฟล์อุปกรณ์ (File I/O) ไฟล์มาตรฐานของอุปกรณ์รับและแสดงผล (Standard Files) การจัดการไฟล์ I/O และการป้อนข้อมูลและเอาท์พุทไฟล์ การเข้าถึงไฟล์ (File access) – การเข้าถึงไฟล์โดยตรง (Direct input/output) – การับและแสดงค่าแบบไม่จัดรูปแบบ (Unformatted input/output) – การับและแสดงค่าแบบกาหนดรูปแบบ (Formatted input/output)
• การกาหนดตาแหน่งของไฟล์ (File positioning) • การดาเนินการกับไฟล์ (Operations on files) • ฟังก์ชันการรับและแสดงผลของภาษาซี http://1.bp.blogspot.com/-tw1caa8lBus/Vphe8RV3rwI/AAAAAAAAAKM/wAhp-ds7iQM/s1600/8.png
Input & Output • • • •
การป้อนข้อมูล หมายถึง การนาข้อมูลบางอย่างเข้าสู่โปรแกรม การป้อนข้อมูล อาจรับเข้าจากไฟล์หรือการป้อนข้อมูลทีละชุด ภาษา C มีฟังก์ชั่น เพื่ออ่านอินพุตจากอุปกรณ์หรือไฟล์ไบนารี การส่งออกข้อมูล หมายถึง การแสดงผลข้อมูลบางอย่างบนหน้าจอ เครื่องพิมพ์หรือไฟล์ใด ๆ • ภาษา C มีฟังก์ชั่น เพื่อส่งออกข้อมูลบนหน้าจอคอมพิวเตอร์และบันทึกไว้ ในข้อความหรือไฟล์ไบนารี
https://www.seas.upenn.edu/~cis1xx/resources/java/fileIO/introToFileI
ไฟล์ (File) • ไฟล์เป็นที่เก็บข้อมูลต่าง ๆ ของคอมพิวเตอร์ และในภาษา C นั้นไฟล์ก็จะมีความหมายรวมไปถึง อุปกรณ์ต่างๆ ที่ต่อกับเครื่องคอมพิวเตอร์ด้วย เช่น คีย์บอร์ด จอภาพ • การติดต่อกับไฟล์จะต้องผ่านลิจิกคอลอินเตอร์เฟส (Logical Interfaces) ที่เรียกว่าสตรีม ไฟล์จะ มีอยู่ 2 ประเภทคือ – Text file เป็นไฟล์ของตัวอักษร เพราะมีโครงสร้างในการเก็บข้อมูลจะเป็นตัวอักษรไฟล์ ข้อมูลจะถูกแปลงเป็น เลขฐานสองตามมาตรฐาน – Binary File เป็นไฟล์ที่เก็บข้อมูลที่อยู่ในรูปแบบต่างๆ
• File Table คือ ส่วนของหน่วยความจาที่เก็บข้อมูลต่าง ๆที่เกี่ยวกับไฟล์
http://basic-c.weebly.com/3611361936323648361636073586362935913652361536213660.html
Standard Files • ภาษา C ถือว่าอุปกรณ์ทั้งหมดเป็นไฟล์ • ดังนั้นอุปกรณ์ต่างๆ เช่น จอแสดงผลมีการแก้ไขในลักษณะเดียวกับไฟล์ และแฟ้มดังตาราง Standard File File Pointer Device Standard input
stdin
Keyboard
Standard output
stdout
Screen
Standard error
stderr
Your screen
https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/WritingAudioDrivers/AudioOnMacOSX/AudioOn
การจัดการไฟล์ I/O • • • • •
การนาเข้าและส่งออกอุปกรณ์มาตรฐาน ภาษา C สร้างข้อความหรือไฟล์ไบนารีสาหรับการจัดเก็บข้อมูล ไฟล์ที่แสดงให้เห็นถึงลาดับของไบต์ โดยไม่คานึงถึงแฟ้มข้อความหรือแฟ้มไบนารี จัดการไฟล์บนอุปกรณ์จัดเก็บข้อมูลผ่านการจัดการไฟล์
http://na5cent.blogspot.com/2015/01/java-stream.html
การป้อนข้อมูลและเอาท์พุทไฟล์ • ภาษาซีการเขียนโปรแกรมภาษาซีมีฟังก์ชันไลบรารีมาตรฐานสาหรับการ ป้อนข้อมูลและเอาท์พุทไฟล์ เป็นกลุ่มของของไลบรารีมาตรฐาน <stdio.h> • “portable I/O package” • ฟังก์ชันการทางาน I / O ของ C อยู่ในระดับค่อนข้างต่าตามมาตรฐานใหม่ • การดาเนินการไฟล์ทั้งหมด ดาเนินการกับสตรีม (Stream) ไบต์ ซึ่งเป็น “สตรีมอินพุต” หรือ “สตรีมเอาท์พุท” • รูปแบบสตรีมไฟล์ I / O ได้รับความนิยมโดย Unix ซึ่งพัฒนาขึ้น
การเข้าถึงไฟล์ (File access) fopen freopen fflush fclose setbuf setvbuf fwide
เปิดไฟล์ (ด้วยชื่อไฟล์ที่ไม่ใช่ Unicode บน Windows และชื่อไฟล์ UTF-8 ที่เป็นไปได้ใน Linux) เปิดไฟล์อื่นจากสตรีมที่มีอยู่ เข้าจังหวะกับสตรีมข้อมูลขาออกพร้อมกับไฟล์จริง ปิดไฟล์ ตั้งค่าบัฟเฟอร์สาหรับสตรีมไฟล์ ตั้งค่าบัฟเฟอร์และขนาดของไฟล์สาหรับสตรีมไฟล์ สลับการสตรีมไฟล์ระหว่าง I / O แบบกว้างและ I / O ที่แคบ
http://www.studytonight.com/java/java-io-stream.php
https://en.wikipedia.org/wiki/C_file_input/output#fseek
การเข้าถึงไฟล์โดยตรง (Direct input/output) fread fwrite
#include <stdio.h> #include <string.h> int main(){ FILE *fp; char c[] = "this is tutorialspoint"; char buffer[100]; /* Open file for both reading and writing */ fp = fopen("file.txt", "w+"); /* Write data to the file */ fwrite(c, strlen(c) + 1, 1, fp); /* Seek to the beginning of the file */ fseek(fp, SEEK_SET, 0); /* Read and display data */ fread(buffer, strlen(c)+1, 1, fp); printf("%s\n", buffer); fclose(fp); return(0); }
อ่านค่าจากไฟล์ เขียนค่าลงไฟล์
การับและแสดงค่าแบบไม่จัดรูปแบบ (Unformatted input/output)
fgetc getc fgets fputc putc fputs
fgetwc getwc fgetws fputwc putwc fputws
getchar
getwchar
อ่านไบต์ / wchar_t จาก stdin
gets
N/A
อ่านสตริงไบต์จาก stdin จนกว่าจะพบบรรทัดใหม่หรือจุดสิ้นสุด ของไฟล์ (เลิกใช้ใน C99 แล้วนาออกจาก C11)
putchar puts ungetc
putwchar N/A ungetwc
เขียนไบต์ / wchar_t เป็น stdout เขียนสตริงไบต์เป็น stdout ทาให้ไบต์ / wchar_t กลับเข้าสู่สตรีมไฟล์
อ่านไบต์ หรือ wchar_t จากไฟล์สตรีม อ่านบรรทัด byte / wchar_t จากไฟล์สตรีม
เขียนไบต์ / wchar_t เป็นสตรีมไฟล์ เขียนสตริงไบต์ / wchar_t เป็นสตรีมไฟล์
การับและแสดงค่าแบบกาหนดรูปแบบ (Formatted input/output) scanf fscanf sscanf vscanf vfscanf vsscanf printf fprintf sprintf snprintf vprintf vfprintf vsprintf vsnprintf perror
wscanf fwscanf swscanf vwscanf vfwscanf vswscanf
อ่านรูปแบบไบต์ / wchar_t input จาก stdin, ไฟล์สตรีมหรือบัฟเฟอร์ อ่านไบต์อินพุต / wchar_t จากดิสก์ ไฟล์สตรีมหรือบัฟเฟอร์โดยใช้อาร์กิวเมนต์ ตัวแปร
wprintf fwprintf swprintf
พิมพ์รูปแบบไบต์ / wchar_t เอาท์พุทเป็น stdout, ไฟล์สตรีมหรือบัฟเฟอร์
vwprintf vfwprintf vswprintf
พิมพ์รูปแบบไบต์ / wchar_t ส่งออกไปยัง stdout ไฟล์สตรีมหรือบัฟเฟอร์โดยใช้ อาร์กิวเมนต์ตัวแปร
N/A
เขียนคาอธิบายของข้อผิดพลาดปัจจุบันในไฟล์ stderr
การกาหนดตาแหน่งของไฟล์ (File positioning) ftell ftello
แสดงตัวบ่งชี้ตาแหน่งไฟล์ปัจจุบัน
fseek fseeko
ย้ายตัวบ่งชี้ตาแหน่งไฟล์ไปยังตาแหน่งที่ตั้งเฉพาะในไฟล์
fgetpos รับตัวบ่งชี้ตาแหน่งของไฟล์ fsetpos ย้ายตัวบ่งชี้ตาแหน่งไฟล์ไปยังตาแหน่งที่ตั้งเฉพาะในไฟล์ rewind ย้ายตัวบ่งชี้ตาแหน่งของไฟล์ไปยังจุดเริ่มต้นในไฟล์
https://rossofenice.com/
การจัดการข้อผิดพลาด (Error handling) #include <stdio.h> int main (){ FILE *fp; int c; fp = fopen("file.txt","r"); if(fp == NULL) { perror("Error in opening file"); return(-1); }
clearerr feof ferror
ล้างข้อผิดพลาด ตรวจสอบจุดสิ้นสุดของไฟล์ ตรวจสอบข้อผิดพลาดของไฟล์
while(1) { c = fgetc(fp); if( feof(fp)) { break ; } printf("%c", c); } fclose(fp); return(0); }
https://fivera.net/hatom-feed-hatom-entry-error-wordpress-
การดาเนินการกับไฟล์ (Operations on files) #include <stdio.h> #include <string.h>
remove rename tmpfile tmpnam
int main (){ int ret; FILE *fp; char filename[] = "file.txt"; fp = fopen(filename, "w"); fprintf(fp, "%s", "This is tutorialspoint.com"); fclose(fp); ret = remove(filename); if(ret == 0) { printf("File deleted successfully"); } else { printf("Error: unable to delete the file"); } return(0); }
ลบไฟล์ เปลี่ยนชื่อไฟล์ ส่งกลับตัวชี้ไปยังแฟ้มชั่วคราว ส่งคืนชื่อไฟล์ที่ไม่ซ้ากัน
ฟังก์ชัน getchar() • ฟังก์ชันอ่านตัวอักษรจากหน้าจอและส่งกลับมาเป็นจานวนเต็ม • ฟังก์ชันนี้จะอ่านเพียงตัวเดียว • ฟังก์ชัน getche() และ getch() มีรูปแบบดังนี้ #include <stdio.h> int main (){ char c; printf("Enter character: "); c = getchar(); printf("Character entered: "); putchar(c); return(0); }
https://www.tutorialspoint.com/cprogramming/c_input_output. htm
ฟังก์ชัน putchar() • การแสดงผลตัวอักษรหรืออักขระ ( char ) ออกทางหน้าจอ โดยคาสั่งนั้น คือ คาสั่ง putchar() #include <stdio.h> int main (){ char ch;
for(ch = 'A' ; ch <= 'Z' ; ch++) { putchar(ch); } return(0); }
ฟังก์ชัน gets() • ฟังก์ชัน gets() ใช้สาหรับข้อมูลชนิดสตริงก์หรือข้อความซึ่งป้อนทาง แป้นพิมพ์ • โดยมีรูปแบบดังนี้ #include <stdio.h> int main() { char str[50]; printf("Enter a string : "); gets(str);
printf("You entered: %s", str); return(0); }
ฟังก์ชัน puts() • ฟังก์ชัน puts() ใช้สาหรับแสดงข้อความทางหน้าจอ • โดยมีรูปแบบดังนี้ #include <stdio.h> #include <string.h> int main(){ char str1[15]; char str2[15]; strcpy(str1, "tutorialspoint"); strcpy(str2, "compileonline"); puts(str1); puts(str2); return(0); }
ฟังก์ชัน printf() • ฟังก์ชันที่ใช้ในการแสดงผลข้อมูลออกทางจอภาพ มีรูปแบบดังนี้ • ตัวอย่าง printf(“i = %d \n”,i); • ภายใน “” จะมีเครื่องหมาย % อยู่ตาม Format Code และแสดงค่าที่ กาหนดหลังเครื่องหมาย ,
http://www.comnetsite.com/c-programmingtip21.php
ฟังก์ชัน scanf() • ฟังก์ชันที่ใช้ในการแสดงผลข้อมูลออกทางจอภาพ • ฟังก์ชัน scanf จาเป็นต้องใส่ Format Code ไว้ในเครื่องหมาย “” • ระบุตัวแปรที่ใช้รับข้อมูล โดยใช้เครื่องหมาย & หน้าตัวแปร ยกเว้น อาร์เรย์ ดังตัวอย่าง
http://www.comnetsite.com/c-programmingtip21.php
การจัดการไฟล์ I/O • • • •
Opening Files Closing a File Writing a File Reading a File
http://na5cent.blogspot.com/2015/01/java-stream.html
การเปิด-ปิดไฟล์ (Opening Files) #include <stdio.h> #include <stdlib.h>
r - open for reading w - open for writing (file need not exist) a - open for appending (file need not exist) r+ - open for reading and writing, start at int main(){ beginning FILE * fp; w+ - open for reading and writing (overwrite file) fp = fopen ("file.txt", "w+");a+ - open for reading and writing (append if file exists) fprintf(fp, "%s %s %s %d", "We", "are", "in", 2560);
fclose(fp); return(0); }
การเขียนไฟล์ (Writing a File) FILE *fp; • FILE *fp; fp=fopen("c:\\test.bin", "wb"); • fp=fopen("c:\\test.txt", "w"); char x[10]="ABCDEFGHIJ"; • fprintf(fp, "Testing...\n"); fwrite(x, sizeof(x[0]), sizeof(x)/sizeof(x[0]), fp);
• int fgetc (FILE *fp); • int fputc( int c, FILE *fp );
http://www.cprogramming.com/tutorial/cfilei
การอ่านไฟล์ (Reading a File) FILE* fp; char buffer[255]; fp = fopen("file.txt", "r"); while(fgets(buffer, 255, (FILE*) fp)) { printf("%s\n", buffer); } fclose(fp);
สรุป • การเขียนโปรแกรมภาษาซีมีฟังก์ชันไลบรารีมาตรฐานสาหรับการป้อน ข้อมูลและแสดงผลข้อมูลเป็นกลุ่มของของไลบรารีมาตรฐาน <stdio.h> • การอ่านเขียนไฟล์ดาเนินการกับสตรีมไบต์ เพื่อให้ควบคุมการรับและ แสดงผลข้อมูลจากอุปกรณ์ต่างๆ หรือจัดเก็บไฟล์ข้อมูล • ฟังก์ชันในการอ่านค่าและเขียนค่าของอุปกรณ์ เช่น printf() scanf() ที่ นิยมนามาใช้ในการรับค่าของข้อมูลประเภทต่างๆ ได้ • การอ่านเขียนไฟล์ของอุปกรณ์ I/O ผ่านฟังก์ชันในการอ่านไฟล์ เขียนไฟล์ รวมถึง การจัดการกับไฟล์และข้อผิดพลาดที่เกิดขึ้นได้