Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

ชนิดข้อมูลที่คืนของ getchar(), fgetc() และ getc() ใน C

ฟังก์ชันอ่านตัวอักษร 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

ตารางเปรียบเทียบ

ฟังก์ชันSourceTypeReturn Typeหมายเหตุ
getchar()stdinFunctionintเทียบเท่า getc(stdin)
fgetc()FILE*Functionintปลอดภัยกว่า getc()
getc()FILE*Macro/Functionintอาจเร็วกว่า แต่ 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