เกิดอะไรขึ้นกับ fgets ถ้า buffer เล็กกว่าความยาวบรรทัด

เวลาเขียนภาษา C เราใช้ fgets ต้องระบุด้วยว่า buffer ขนาดเท่าไหร ประมาณนี้

char buf[80];
fgets(buf, 80, fp);  

จากตัวอย่างข้างบนถ้าบรรทัดยาวกว่า 79 byte (ต้องเหลือที่ไว้ใส่ ” ด้วย) จะเกิดอะไรขึ้น เท่าที่ลองดู fgets มันก็อ่านได้อยู่ดี อ่านได้แค่ไหนก็เอามาแค่นั้น ไม่มีอะไร return ออกมาพิเศษ

แต่ทำอย่างไรจะตรวจสอบได้ว่าอ่านมาไม่หมด เท่าที่คิดได้ตอนนี้คือดูว่าตัวสุดท้ายใน buf เป็น newline หรือเปล่า ถ้าไม่ใช่ก็อาจจะอ่านมาไม่หมด แต่นี้ลองใน Ubuntu 8.04 นะครับ อาจจะมีระบบอื่นๆ กรณีอื่นๆ ที่ต่างออกไป

6 thoughts on “เกิดอะไรขึ้นกับ fgets ถ้า buffer เล็กกว่าความยาวบรรทัด

  1. > แต่ทำอย่างไรจะตรวจสอบได้ว่าอ่านมาไม่หมด
    > เท่าที่คิดได้ตอนนี้คือดูว่าตัวสุดท้ายใน buf เป็น newline หรือเปล่า
    > ถ้าไม่ใช่ก็อาจจะอ่านมาไม่หมด แต่นี้ลองใน Ubuntu 8.04 นะครับ
    > อาจจะมีระบบอื่นๆ กรณีอื่นๆ ที่ต่างออกไป

    function test()
    {
    // anonymous block
    {
    char dummy[80];
    memset(dummy, ‘\n’, 80);
    }

    // code goes here
    {
    char buf[80];
    fget(buf, 80, fp);

    // there is a very high possibility that the below expression
    // will return TRUE, because the ‘buf’ variable is not initialized
    // and will use unexpected value
    if (buf[79] != ‘\\n’)
    printf(”the whole line was not read, not enough buffer\n”);
    }
    }

  2. แบบที่จะดู \n คือประมาณข้างล่างอะครับ
    int
    check(char *buf) {
    char *p;
    for(p = buf; *p != ”;p++);
    return p != buf && *(p-1) != ‘\n’;
    }
    หา NUL ก่อนค่อยดูว่าข้างหน้าเป็น newline หรือเปล่า

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s