标准输入、输出、错误设备


在ANSI C、Unix、Windows编程中,都定义有三个标准设备,即标准输入设备、标准输出设备以及标准错误设备。

标准输入设备通常是键盘
标准输出设备通常是屏幕
标准错误设备通常是屏幕


1)  标准设备
    在ANSI C编程中,三个标准设备分别是:stdin,stdout,stderr
    在stdio.h中有如下定义   
#define stdin  (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])
    一个使用标准设备的例子如下
/*
 * FileName: Stand_C_Device.cpp 
 * Author:   JarvisChu
 * Date:     2012-11-07
 */

#include <stdio.h>

int main(int argc, char* argv[])
{
	int n;

	fscanf(stdin,"%d",&n);      //keyboard default
	fprintf(stdout,"%d\n",n);   //screen default
	fprintf(stderr, "This is stderr\n");//screen default
	
	return 0;
}


     2)  Windows定义有三个标准设备
        Windows编程中,也同样存在这样三个标准设备,只不过我们不用stdin这样的方式去使用,而是使用Windows API先获取这个三个标准设备的句柄,然后通过句柄去使用标准设备。
        通过Handle GetStdHandle(DWORD nStdHandle)来获取标准设备的句柄       
        nStdHandle :STD_INPUT_HANDLE
                     STD_OUTPUT_HANDLE
                     STD_ERROR_HANDLE   

     标准输入\输出\错误设备,默认也是键盘\屏幕\屏幕,但是我们可以通过调用函数 BOOL SetStdHandle(DWORD nStdHandle,Handle hHandle)来重置标准设备。
     
/*
 * FileName: Stand_Windows_Device.cpp 
 * Author:   JarvisChu
 * Date:     2012-11-07
 */

#include <stdio.h>
#include <windows.h>

#define BUFF_SIZE 256

int main(int argc, char* argv[])
{
	DWORD nRead;
	DWORD nWrite;
	TCHAR buf[BUFF_SIZE];
     
	HANDLE hStd_Input = GetStdHandle(STD_INPUT_HANDLE);   //Get the standard input device
	HANDLE hStd_Output = GetStdHandle(STD_OUTPUT_HANDLE); //Get the standard input device
	HANDLE hStd_Error = GetStdHandle(STD_ERROR_HANDLE);   //Get the standard error device

	//read from stdinput, and write to stdoutput
	while(ReadFile(hStd_Input,buf,BUFF_SIZE,&nRead,NULL) && nRead>0)
	{
		if(!WriteFile(hStd_Output,buf,nRead,&nWrite,NULL) || nRead != nWrite)
		{

			WriteFile(hStd_Error,"WriteFile Error",sizeof(TCHAR)*15,NULL,NULL);
		}
		break; //For the purpose of testing,just read one line
	}


        //--------------------------------------------------------------------------------------------
        //Standard Input Redirection

	HANDLE hFileIn = CreateFile("in.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
	
	//the two statements below complete the redirection
	SetStdHandle(STD_INPUT_HANDLE,hFileIn);               //set the hFileIn as the standard input device
	HANDLE newStd_Input = GetStdHandle(STD_INPUT_HANDLE); //Get the standard input device,now is hFileIn

	while(ReadFile(newStd_Input,buf,BUFF_SIZE,&nRead,NULL) && nRead>0)
	{
		WriteFile(hStd_Output,buf,nRead,&nWrite,NULL);
	}
	
	SetStdHandle(STD_INPUT_HANDLE,hStd_Input);  //Reset the Standard Input Device to default


	//--------------------------------------------------------------------------------------------
        //Standard Output Redirection

	HANDLE hFileOut = CreateFile("out.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,0,NULL);
	
	//the two statements below complete the redirection
	SetStdHandle(STD_OUTPUT_HANDLE,hFileOut);               //set the hFileIn as the standard input device
	HANDLE newStd_Output = GetStdHandle(STD_OUTPUT_HANDLE); //Get the standard output device,now is hFileout
	
	while(ReadFile(hStd_Input,buf,BUFF_SIZE,&nRead,NULL) && nRead>0)
	{
		WriteFile(newStd_Output,buf,nRead,&nWrite,NULL);
		break; //For the purpose of testing,just read one line
	} 

        //Reset the Standard IO Device to default
	SetStdHandle(STD_OUTPUT_HANDLE,hStd_Output);


	//--------------------------------------------------------------------------------------------
        //Close Handles
	CloseHandle(hFileIn);
	CloseHandle(hFileOut);
	CloseHandle(hStd_Input);
	CloseHandle(hStd_Input);
	CloseHandle(newStd_Input);
	CloseHandle(newStd_Output);

	return 0;
}
     其中in.txt中的内容如下     
博客地址
blog.csdn.net/jarvischu
程序运行效果如下:



    3) Windows 控制台IO
       对于标准的输入输出设备,我们可以不用ReadFile WriteFile函数来操作,直接使用ReadConsole和WriteConsole来读写控制台,      
       使用SetConsoleMode来设置控制台的模式

/*
 * FileName: Windows_Console_IO.cpp 
 * Author:   JarvisChu
 * Date:     2012-11-07
 */

#include <stdio.h>
#include <windows.h>
#include <tchar.h>

#define BUFF_SIZE 256

int main(int argc, char* argv[])
{
	HANDLE hStdIn, hStdOut;
	TCHAR buf[BUFF_SIZE];
	DWORD nRead, nWrite;

	//CONIN$ is the default path of Console Input
	//CONOUT$ is the default path of Console Output
	hStdIn = CreateFile(_T("CONIN$"),GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    hStdOut = CreateFile(_T("CONOUT$"),GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

	SetConsoleMode(hStdIn,ENABLE_LINE_INPUT|ENABLE_WINDOW_INPUT|ENABLE_ECHO_INPUT|ENABLE_PROCESSED_INPUT|ENABLE_MOUSE_INPUT);
	SetConsoleMode(hStdOut,ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT);

	ReadConsole(hStdIn,buf,BUFF_SIZE,&nRead,NULL);
    WriteConsole(hStdOut,buf,nRead,&nWrite,NULL);

	CloseHandle(hStdIn);
	CloseHandle(hStdOut);
	return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux系统中,标准输入(stdin)、标准输出(stdout)和标准错误(stderr)是三个常用的输入输出设备标准输入设备(stdin)是用于接收用户输入设备。在Linux终端中,通常使用键盘作为标准输入设备。用户可以通过向程序提供输入数据,与程序进行交互。比如,当我们在终端输入命令时,输入的内容就是通过标准输入设备传递给程序的。 标准输出设备(stdout)是用于向用户显示输出信息的设备。在Linux终端中,默认情况下,标准输出设备就是终端屏幕。程序中通过调用输出函数,将需要显示的信息发送到标准输出设备上。例如,我们在终端执行一个命令时,命令的输出结果就会显示在标准输出设备上。 标准错误设备(stderr)用于输出错误信息。和标准输出设备类似,标准错误设备默认情况下也是终端屏幕。程序可以通过将错误信息发送到标准错误设备上,通知用户当前程序执行遇到了错误或异常。与标准输出不同的是,标准错误输出可以与标准输出分开。可以将标准输出保存到文件中,并将标准错误信息显示在终端上,或者将标准错误重定向到另外一个文件中。 使用这些标准输入输出设备,可以使程序与用户进行交互,接收输入数据,展示输出结果,并及时通知用户错误信息。同时,通过将标准输出标准错误输出重定向到不同的位置,可以方便地进行日志记录和错误排查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值