第二章   控制台输入输出

 

译自 《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_);