十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
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)
}
}