本文转自:http://blog.csdn.net/astropeak/article/details/6651747
本文将从基本原理解析标准输入,标准输出的由来(最终结论见最后).
对于一个运行的程序,不可避免地要进行某些输入输出操作,也即I/O操作.对于I/O操 作,C语言提供了一系列标准I/O函数,来完成输入输出任务.
最主要的标准I/O函数包括:fopen()(打开一个文件),fprintf()(写文件),fscanf()(读文 件).读写一个文件的步骤为:
打开文件,同时得到指向文件的指针,然后以该指针为参数, 调用相应的读,写函数进行文 件读写.例如:若想从键盘获取输入(也即读文件,Unix系统下程序可将键盘和屏幕当作普通文件对待),需首先使用fopen()打开键盘这个文件,获 得指向它的指针,然后以该指针为参数调用fscanf()读取该文件内容,从而获得键盘输入;若 想输出信息到显示器(也即写文件),需首先打开显示器这个文件,获得指向它的指针,然后 以该指针为参数调用fprintf()向该文件写入信息, 从而向显示器输出信息.以上步骤在 Unix系统中,可通过以下代码实现:
/*
在Unix系统下,读取键盘输入,向屏幕输入信息.
手动打开键盘和显示器文件并进行读写.
*/
#include
intmain(void)
{
FILE*pf;
pf=fopen("/dev/tty","a+");//终端字符文件
charsbuf[100];
fprintf(pf, "Please input a string: ");
fscanf(pf,"%s",sbuf);
fprintf(pf,"The input string is : \"%s\".\n",sbuf);
return0;
}
注:/dev/tty为终端字符文件,该文件是对键盘,显示器的抽象,向该文件写入,则写入内 容将被显示在显示器,读该文件,则将从键盘获得输入.
采用以上方式获取键盘输入,向屏幕输出将是系统相关的(因为不同系统对键盘,屏幕的 抽象方式不同).为了封装键盘,屏幕I/O操作的底层实现细节,C语言要求系统为每个程序 提供两个指针,这两个指针分别指向键盘和屏幕,并将这两个指针命名为:stdin和 stdout.这两个指针就是所谓的标准输入和标准输出.此时,从键盘获取输入,向屏幕输出 信息的代码可写为:
/*
在任意系统下,读取键盘输入,向屏幕输入信息.
显式得使用标准输入,标准输出指针.
*/
#include
intmain(void)
{
charsbuf[100];
fprintf(stdout, "Please input a string: ");
fscanf(stdin,"%s",sbuf);
fprintf(stdout,"The input string is : \"%s\".\n",sbuf);
return0;
}
与代码1不同,该代码将能够运行于任何支持标准C的系统.由于从标准输入获取输入,向标 准输出显示信息是非常常用的操作(几乎每个控制台程序均包含该操作),因此C语言提供 了专门用于从标准输入获取信息和向标准输出显示信息的函数,即scanf()和printf().此 时,从键盘获取输入,向屏幕显示信息的代码可写为:
/*
标准的C程序,读取键盘输入,向屏幕输入信息.
隐式得使用标准输入,标准输出指针.
*/
#include
intmain(void)
{
charsbuf[100];
printf("Please input a string: ");
scanf("%s",sbuf);
printf("The input string is : \"%s\".\n",sbuf);
return0;
} 从中可看出,使用scanf()和printf()时,无需向其提供文件指针,这是因为它们知道所需 的文件指针,它们操作的对象便是标准输入和标准输出所指向的文件.
结论:
标准输入,标准输出是操作系统为C程序提供的文件指针,默认情况下,它们分别指向键盘 和屏幕.标准输入函数scanf()将从标准输入指向的文件读取信息,标准输出函数 printf()将输出信息到标准输出指向的文件.
注:标准输入,标准输出并非必须指向键盘或屏幕,用户程序可改变它们的指向.