日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(转)标准I/O缓冲:全缓冲、行缓冲、无缓冲 .

發布時間:2024/4/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)标准I/O缓冲:全缓冲、行缓冲、无缓冲 . 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

某日一朋友寫了一個HELLO WORLD代碼,出不來結果,代碼如下:


#include <stdio.h>

int

main(int argc, char **argv){

??? printf("hello world!");

??? _Exit(0);

}

?


?

注意到,在代碼中printf語句打印的字符串最后沒有帶換行符,而且最后調用了_Exit函數,這導致了在終端屏幕上顯示不出來字符串"hello world!"。

?

首先介紹一下UNIX里面關于標準IO的幾種緩沖機制:

1、全緩沖 。全緩沖指的是系統在填滿標準IO緩沖區之后才進行實際的IO操作;注意,對于駐留在磁盤上的文件來說通常是由標準IO庫實施全緩沖。

2、行緩沖 。在這種情況下,標準IO在輸入和輸出中遇到換行符時執行IO操作;注意,當流涉及終端的時候,通常使用的是行緩沖。

3、無緩沖 。無緩沖指的是標準IO庫不對字符進行緩沖存儲;注意,標準出錯流stderr通常是無緩沖的。

?

其次介紹一下幾個退出函數:

1、exit ()。調用exit函數之后,它首先會執行一系列的清理處理,包括調用執行各終止處理程序,關閉所有標準IO流等,然后進入內核。

2、_exit ()。與exit不同的是,它不進行清理工作而直接進入內核。此函數由POSIX.1說明,放在unistd.h里面。

3、_Exit ()。同樣,它也不進行清理工作而直接進入內核。此函數跟exit一樣由ISO C說明,放在stdlib.h里面。

?

現在回過頭來看上面的那段代碼,很容易發現,由于printf函數是行緩沖的(因為它要往終端輸出數據),而且要打印的字符串不帶換行符,因此在它沒有遇到換行符或者沒有填滿緩沖區之前不會進行實際的IO操作,而緊接下來的_Exit函數又立即進入內核沒有處理IO緩沖區,所以我們在終端上看不到hello world語句。

?

我們可以有很多方法修正這段代碼。最簡單的莫過于增加一個換行符:

?


#include <stdio.h>

int

main(int argc, char **argv){

??? printf("hello world!/n");

??? _Exit(0);

}


此時行緩沖遇到換行符/n,執行實際IO操作。

?

其次,我們可以調用exit函數,讓它幫我們進行相應的IO處理:

?


#include <stdio.h>

int

main(int argc, char **argv){

??? printf("hello world!");

??? exit(0);

}


exit函數在進入內核之前,對存儲在緩沖區內的數據進行沖洗,然后關閉IO流。

?

或者,我們可以改變標準輸出流的默認緩沖模式:

?


#include <stdio.h>

int

main(int argc, char **argv){

??? setvbuf(stdout, NULL, _IONBF, 0);

??? printf("hello world!");

??? _Exit(0);

}


此時,由于調用了setvbuf函數,把標準輸出流默認的行緩沖變成了無緩沖(具體請查閱setvbuf函數實現機制),因此調用printf時立即輸出。

?

當然,我們還可以調用fclose函數來達到此目的:

?


#include <stdio.h>

int

main(int argc, char **argv){

??? printf("hello world!");

??? fclose(stdout);

??? _Exit(0);

}


實際上, fclose函數隱含包含了一次fflush操作,把緩沖區內的數據沖洗到終端。

?http://blog.csdn.net/seton040/article/details/4504825

轉載于:https://www.cnblogs.com/wonderKK/archive/2012/06/13/2547740.html

總結

以上是生活随笔為你收集整理的(转)标准I/O缓冲:全缓冲、行缓冲、无缓冲 .的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。