1、setbuf() 用來(lái)設(shè)置緩沖區(qū)特性,如果需要改變緩沖的特點(diǎn)和大小等,使用該調(diào)用。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了本溪免費(fèi)建站歡迎大家使用!
2、fflush(stdin) fflush(stdout) 用來(lái)強(qiáng)制刷新緩沖區(qū)數(shù)據(jù)。如果需要在每次i/o操作前后,不希望緩沖中存在歷史數(shù)據(jù)或者不期望的數(shù)據(jù)或者為了清除緩存等的時(shí)候使用。
函數(shù)名: freopen
功 能: 替換一個(gè)流
用 法: FILE *freopen(char *filename, char *type, FILE *stream);
程序例:
#include stdio.h
int main(void)
{
/* redirect standard output to a file */
if (freopen("OUTPUT.FIL", "w", stdout)
== NULL)
fprintf(stderr, "error redirectingstdout\n");
/* this output will go to a file */
printf("This will go into a file.");
/* close the standard output stream */
fclose(stdout);
return 0;
}
===========================================================
上面不懂, 可以向下看, 沒(méi)關(guān)系. 實(shí)踐+理論 , 會(huì)慢慢在這詳解.., 慢慢看.
下面重點(diǎn):
在這再說(shuō)一下. 不然很難理解, 我都沒(méi)想到. 一直困惑不清啊....stdin stdout stderr.
現(xiàn)在懂了.
牢記: 目前主要的緩存特征是:stdin和stdout是行緩存;而stderr是無(wú)緩存的。
本文介紹如何將 stdout 時(shí)重定向到文件從某個(gè) C 的程序,然后還原原始的 stdout 同一程序的某個(gè)更高位置。 C 函數(shù)通常用于重定向 stdout 或 stdin 是 freopen()。 要將 stdout 時(shí)重定向到文件名為 FILE.TXT 中,使用下面的調(diào)用:
freopen( "file.txt", "w", stdout ); //把內(nèi)容寫到這個(gè)文件"file.txt"
此語(yǔ)句使所有的后續(xù)輸出,通常定向到轉(zhuǎn)到文件 FILE.TXT stdout,向。
若要返回到顯示默認(rèn) stdout) 的 stdout,使用下面的調(diào)用:
freopen( "CON", "w", stdout ); //輸出到控制臺(tái)"CON"
在這兩種情況下檢查 freopen() 以確保重定向?qū)嶋H發(fā)生的返回值。
下面是短程序演示了 stdout 時(shí)重定向:
運(yùn)行代碼
// Compile options needed: none
#include stdio.h
#include stdlib.hvoid main(void)
{
FILE *stream ;
//將內(nèi)容寫到file.txt, "W"是寫 ("r"是讀)
if((stream = freopen("file.txt", "w", stdout)) == NULL)
exit(-1);
printf("this is stdout output\n");
stream = freopen("CON", "w", stdout);stdout 是向程序的末尾的控制臺(tái)重定向
printf("And now back to the console once again\n");
}
"CON" 是指控制臺(tái) 就想DOS窗口.
==========================================
運(yùn)行代碼:
#include stdio.h
#include stdlib.h
void main(void)
{
FILE *stream ;
char s[102400]="";
if((stream = freopen("file.txt", "r", stdin)) == NULL) //從文件讀數(shù)據(jù) (放到stdin , 其實(shí)stdin 也有自己的緩沖區(qū).就向buf)
exit(-1);
fread(s, 1, 1024, stdin); //所以從標(biāo)準(zhǔn)輸入里讀出數(shù)據(jù). 因?yàn)橐⒁鈙tdin也是有自己的一塊緩沖區(qū).
printf("%s\n", s); //在這里打印讀出來(lái)的數(shù)據(jù).
}
stdin, stdout,stderr: standard I/O streams
介紹:
在通常情況下,UNIX每個(gè)程序在開始運(yùn)行的時(shí)刻,都會(huì)有3個(gè)已經(jīng)打開的stream. 分別用來(lái)輸入,輸出,打印診斷和錯(cuò)誤信息。通常他們會(huì)被連接到用戶終端(tty(4)). 但也可以改變到其它文件或設(shè)備。這取決于雙親進(jìn)程的選擇和設(shè)置。
這3個(gè)symbols都是stdio(3) macro,類型為指向FILE的指針。可以被fprintf() fread()等函數(shù)使用。
當(dāng)一個(gè)程序開始啟動(dòng)后,stdin, stdout, and stderr are 0, 1,and 2,其它的文件描述符則排在其后。
stderr是不緩存的,stdout是行間緩存的。請(qǐng)注意:
所以:
for(i = 0; i 10; i++)
{
fprintf(stdout, "This is stdout[%d]", i);
fprintf(stderr, "This is stderr[%d]", i);
}
會(huì)全部顯示stderr之后,再顯示stdout.
又因?yàn)閟tdout是行內(nèi)緩存,所以加 \n 后會(huì)立刻顯示。
在程序中使用stdin,stdout,stderr,可以先:
extern FILE *stdout;
extern FILE *stderr;
重定向:
在實(shí)際應(yīng)用中,可以分別使用stdout,stderr來(lái)輸出。
之后再重定向:
如:
./example 1 /dev/null
這樣就將 stdout(1) 的輸出丟棄。只顯示stderr.
./example 2 /dev/null
這樣就將 stderr(2) 的輸出丟棄。只顯示stdout.
./example /dev/null 21
將2(stderr)重定向到1(stdout). 但又將stdout(1) 丟棄。
所以即為丟棄stdout和stderr.
清除標(biāo)準(zhǔn)輸入(通常是鍵盤)的緩存。
的scanf()函數(shù)接收輸入數(shù)據(jù),一個(gè)情況下,輸入數(shù)據(jù)結(jié)束后,當(dāng)(不是scanf函數(shù)的末尾,scanf函數(shù)只有數(shù)據(jù)在每個(gè)數(shù)據(jù)字段,之后按Enter鍵結(jié)束)。
①案件的空間,“輸入”,“跳格”按鈕。
②寬度的情況下結(jié)束。
③如非法入境。
鍵盤緩沖區(qū)可能會(huì)有殘留信息的問(wèn)題。
的scanf()函數(shù)應(yīng)該只掃描標(biāo)準(zhǔn)輸入流,其余的信息是必要的,以解決在scanf中的標(biāo)準(zhǔn)輸入
()函數(shù)后添加FFLUSH(標(biāo)準(zhǔn)輸入)。
平齊(標(biāo)準(zhǔn)輸入)刷新標(biāo)準(zhǔn)輸入緩沖區(qū),廢棄
FFLUSH(標(biāo)準(zhǔn)輸出)刷新標(biāo)準(zhǔn)輸出緩沖區(qū)的東西輸入緩沖器,對(duì)事物的輸出緩沖器輸出到標(biāo)準(zhǔn)輸出設(shè)備上。
import?(
"bytes"
"fmt"
"os/exec"
)
func?exec_shell()?(string,?error){
//函數(shù)返回一個(gè)*Cmd,用于使用給出的參數(shù)執(zhí)行name指定的程序
cmd?:=?exec.Command("shutdown",?"-h","now")
//讀取io.Writer類型的cmd.Stdout,再通過(guò)bytes.Buffer(緩沖byte類型的緩沖器)將byte類型轉(zhuǎn)化為string類型(out.String():這是bytes類型提供的接口)
var?out?bytes.Buffer
cmd.Stdout?=?out
//Run執(zhí)行c包含的命令,并阻塞直到完成。??這里stdout被取出,cmd.Wait()無(wú)法正確獲取stdin,stdout,stderr,則阻塞在那了
err?:=?cmd.Run()
return?out.String(),?err
}
func?main(){
if?result,err:=exec_shell();err!=nil{
fmt.Println("error:",err)
}else{
fmt.Println("exec?succ?",?result)
}
}