setbuf與setvbuf函數,C語言setbuf與setvbuf函數詳解

2020-07-16 10:04:24
在討論 setvbuf 與 setbuf 函數之前,先來看如下一段範例程式碼:
int main(void)
{
    FILE* fp=NULL;
    int fd;
    const char *f1="testfprintf.log";
    const char *f2="testwrite.log";
    fp = fopen(f1, "wb");
    if(fp == NULL)
    {
        return -1;
    }
    fd = open(f2, O_WRONLY|O_CREAT|O_EXCL, 0666);
    if(fd < 0)
    {
        return -1;
    }
    while(1)
    {
        fprintf(fp, "fprintf------|n");
        write(fd, "write|n", sizeof("write|n"));
        sleep(1);
    }
    return 0;
}
在上面的範例程式碼中,使用 fprintf 函數對檔案 testfprintf.log 執行寫入操作,使用 write 函數對檔案 testwrite.log 執行寫入操作。這裡需要注意的是,因為 fprintf 函數會緩衝 4096 位元組的資料,只有當達到這麼多位元組的資料時才會進行實際的磁碟寫入。

因此,執行上面的範例程式,然後實時檢視 testfprintf.log 檔案與 testwrite.log 檔案,會發現 testfprintf.log 檔案不會被實時寫入,只有當寫入的資料的大小為 4096 位元組的倍數的時候才會被寫入;而 write 函數則不同,因為它不進行任何緩衝(直接寫入磁碟),所以檔案 testwrite.log 不斷有資料寫入,執行結果如圖 1 所示。


圖 1 範例程式碼的執行結果