ฟังก์ชันอ่านตัวอักษร 3 ตัวนี้คืนค่าเป็น int ไม่ใช่ char เพื่อให้สามารถแทนค่า EOF (End of File) ได้ ซึ่งมักเป็น -1 และอยู่นอกช่วงของ char
getchar()
อ่านตัวอักษรจาก stdin (Standard Input)
ไวยากรณ์
#include <stdio.h>
int getchar(void);
ตัวอย่าง
#include <stdio.h>
int main() {
int ch; // ต้องเป็น int ไม่ใช่ char!
printf("Enter a character: ");
ch = getchar();
if (ch != EOF) {
printf("The character entered is: ");
putchar(ch);
} else {
printf("EOF or Error\n");
}
return 0;
}
ผลลัพธ์
Enter a character: G
The character entered is: G
fgetc()
อ่านตัวอักษรจาก File Stream (FILE*)
ไวยากรณ์
#include <stdio.h>
int fgetc(FILE *stream);
ตัวอย่าง: อ่านไฟล์ทีละตัวอักษร
#include <stdio.h>
int main() {
FILE *fp = fopen("file.txt", "w");
fprintf(fp, "Apple");
fclose(fp);
fp = fopen("file.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
int ch;
while ((ch = fgetc(fp)) != EOF) {
printf("%c", ch);
}
fclose(fp);
return 0;
}
ผลลัพธ์
Apple
getc()
เหมือน fgetc() แต่เป็น Macro (อาจประเมิน Argument หลายครั้ง) ทำงานเร็วกว่าเล็กน้อย
ไวยากรณ์
#include <stdio.h>
int getc(FILE *stream);
ตัวอย่าง
#include <stdio.h>
int main() {
int ch;
printf("Enter a character: ");
ch = getc(stdin); // stdin เป็น FILE*
if (ch != EOF) {
printf("\nThe character entered is: ");
putchar(ch);
}
return 0;
}
ผลลัพธ์
Enter a character: K
The character entered is: K
ตารางเปรียบเทียบ
| ฟังก์ชัน | Source | Type | Return Type | หมายเหตุ |
|---|---|---|---|---|
| getchar() | stdin | Function | int | เทียบเท่า getc(stdin) |
| fgetc() | FILE* | Function | int | ปลอดภัยกว่า getc() |
| getc() | FILE* | Macro/Function | int | อาจเร็วกว่า แต่ Argument อาจถูกประเมินซ้ำ |
ทำไมต้องคืน int ไม่ใช่ char?
// ผิด! char ไม่สามารถแทน EOF ได้ (EOF มักเป็น -1)
char ch;
while ((ch = getchar()) != EOF) { ... } // Bug: ถ้า char เป็น unsigned, EOF (-1) จะกลายเป็น 255
// ถูกต้อง: ใช้ int
int ch;
while ((ch = getchar()) != EOF) { ... } // ถูกต้อง: int รองรับ -1 ได้
Best Practices
- ใช้ int สำหรับตัวแปรรับค่าจาก getchar/fgetc/getc เสมอ
- ใช้
fgetc()แทนgetc()เมื่อ Argument มี Side Effects (เช่นgetc(fp++)) - ตรวจสอบ
EOFก่อน Cast เป็นchar - ใช้
ferror()ตรวจสอบ Error แยกจาก EOF
ฟังก์ชันคู่: Putchar, Fputc, Putc
int putchar(int ch); // เขียน stdout
int fputc(int ch, FILE *fp); // เขียนไฟล์
int putc(int ch, FILE *fp); // Macro version of fputc