第二章 控制台输入输出
译自 《TangoRefMan_Sep_1_2008.odt 》
通常,在tango中有四种输出到控制台的方法:
1.C Print (不推荐使用,仅用于运行时追踪问题)。
2.Cout/Cerr ,有最少的附属物并且结果是最少二进制代码,但不支持格式化输出,仅支持UTF-8.
3.Stdout/Stderr,标准的控制台格式化输出,Tango的Print。
4.Trace,Stderr的同步版本,同时输出几个不同线程的内容。
Cout,Cerr
通过Cout或Cerr在控制台显示文本,有最少的附属物,它们是tango.io.Console中预定义的实体,接受char[],把它们恰当地输出到设备中。如:
import tango.io.Console;
Cout("now is the time for all good men to come to the aid of their country").newline;
注意有一个newline修饰符附加在后。它的作用相当于传统用法的\n词法,在文本中嵌入行中断。控制台输出被缓冲,如果没有newline,文本将不能立即发送到目的地。如果使用输出行中断不合适,可以使用立即冲洗的方法:
Cout ("now is the time for all good men to come to the aid of their country").flush;
控制台方法支持如下形式的连锁引用:
char [] people = "women";
Cout ("now is the time for all good")(people)("to come to the aid of their country").newline;
注意所有的参数是char[],并且用简单的从左到右的顺序发布,一个简单的flush标志是一个空参数。如:
Cout ("What is your name ?")();
对象引用也能传送到cout :
auto o = new object;
Cout ("the name of Object is")(o).newline;
Cout 允许使用潜在的流实例用法,如快捷的复制一个文本文件到控制台可以使用如下形式:
auto file= new File("myfile");
Cout.stream.copy(file);
类似的,我们可以从一个网站复制原生内容到控制台(使用路径/index.html):
auto site = new SocketConduit;
site.connect(new InternetAddress("mywebsite")).write("GET/index.html HTTP/1.0\n\n");
cout.stream.copy(site);
控制台输入使用相似的方法,使用预定义实体Cin,tango等候一些输入完成,然后把它们全部返回给调用者。交互用法,这是一个典型的输入行(延迟到CR銉被按下):
Cout("What is your name?")();
auto name = Cin.get();
Cout ("Hello")(name).newline;
Cin
Cin是应用程序的输入流,这个流来自控制台用户的输入,通常是面向行的。即,操作系统通常等候用户按下Enter键然后传送整个一行内容给应用程序。如果应用程序想改变按下的键或改成其它特定的键组合,则应该使用C函数(导入tango.stdc).
Cin能加上readln读取一个输入行,返回一个内部缓冲器的一个切片,或加上copyln以返回一个复制品。
控制台异常
当操作系统底层确定一个错误发生时抛出一个IO异常。
Stdout, Stderr
另见我的博文《Stdout使用》
Trace
当跟踪一个程序的运行时,我们常需要输出其运行状态。Stdout/Stderr/Cout/Cerr不适合做这件事,并且它们不是线程安全的,当需要从几个不同的线程一致地输出时使用Trace,以达到同步的目的。如:
import tango.util.log.Trace;
//……
int idx = someCalc();
Trace.formatln("{}@{}: my variale = {}",_FILE_,_LINE_,idx);
//.……
}
C Print
和所有标准C函数一样,Printf是可用的,使用它要导入tango.io.stdio模块。
import tango.io.stdio;
Printf("at pos %lld,%.*s\n",_LINE_,_FILE_);