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