progress里的IO操作以及和操作系统的交互

来源:互联网 发布:淘宝v2贷款怎么操作 编辑:程序博客网 时间:2024/05/20 10:53

关键字:progress 4GL IO language 开发 语言
1.基本io操作
输出的语法:output to {fileName|value(expression)} [append].
输入的语法:input from {fileName|value(expression)}.
输出或者显示的关键字是:
display variable.
put [unformatted] variable.
message variable.
至于换行,可以使用skip属性,或者字符串中插入换行符chr(10),或者直接使用"~n".这里要说明的是:chr(int)是一个有给定的ascii码返回
ascii字符的函数,对应的则是asc(asc字符)把给定字符转换为代码;progress的转义字符是"~"而不是像c以及类c语言里的"/".
例子out.p:
output to value("c:/test.txt").
put 1 skip.
message "nihao" + "~n".
display "haha" + chr(10).
output close.
不过,三种输出方法最好不要混用,不然会出现一些莫名奇妙的问题。并且,严格来说,这三个关键字的侧重还是有区别的。display是要显示一个变量在屏幕上(有window窗口),
而put则是一个标准的常用的用于输出的命令;message是用来现实提示或者错误警告信息的。如果你有了progress环境,你可以很明显的看到这三者的输出是截然不一样的。
现在我假定总是使用put作为输出命令,因为它还有对应的输入命令import。

读取文件内容,使用import命令,它总是一次读取一行。其格式为:
import unformatted variable.
如果每一行已经用某一个字符分割为多个字段,则也可以在读取的时候分别写入多个变量:
import delimiter seperate-char var1|^,var2|^,.... ^表示忽略这个字段。注意缺省的分割字符是空格。如果你的变量数多于实际字段数,则多出来的变量就会赋予空或者0;如果少的话,多余的字段就会被丢弃。

比如有一个文本文件test.txt:
1,2,3
4 5 6

in.p
/*-------------------------------------*/
input from value("c:/test.txt").
define variable mi as char no-undo extent 5.
import mi[1] mi[2] mi[3] mi[4].
message mi[1] "-" mi[2] "-"  mi[3] "-"  mi[4].
import mi[1] mi[2].
message mi[1] "-" mi[2].
input close.

则输出结果为:
1,2,3 - - -
4 - 5

如果你又文本型的数据文件,需要重复输入怎么办呢,这时候需要用到repeat循环了。
input from value("c:/test.txt").
define variable mi as char no-undo extent 5.
repeat:
import mi[1] mi[2] mi[3] mi[4].
message mi[1] "-" mi[2] "-"  mi[3] "-"  mi[4].
end. /*到文件结尾,repeat会自动结束循环*/
input close.

2.高级io操作
如果我需要同时输出或者输入到多个文件时怎么办呢?以上的方法行不通啊。好办!这里需要介绍一个新的关键字stream,流。
一个流的定义为:
define [[new [global]] shared] stream stream-name.
关于共享前面已经介绍过,这里就不多说了。同时我们还要进一步的介绍input,output语句。
input [stream stream-name] from file-name.
output [stream stream-name] to file-name.
input [stream stream-name] close.
output [stream stream-name] close.
相应的还有:
put [stream stream-name] variable.
display [stream stream-name] variable.
message没有对应的输出选项。
其实如果你没有指定流名字的时候,progress会自动的使用一个匿名流。

下边是一个例子:
define stream s1.
define stream s2.

output stream s1 to value("c:/t1.txt").
output stream s2 to value("c:/t2.txt").
put stream s1 "put to s1".
put stream s2 "put to s2".
put stream s1 "put to s1 again".
output stream s1 close.
output stream s2 close.

对于输入是同样的,这里就不再多说了。

3.高级io操作(续)
这一小节里讲的主要是输入输出重定向。如果你需要从某个程序的输出里作为输入或者相反,这时候,我们就要用到input through 和output through语句了。其实他们和对应的input from,output to差不多,就是第二个介词不一样。
其格式为:
input [stream s-name] through app-name|value(app-name).
output [stream s-name] through app-name|value(app-name).
app-name是一个操作系统下的命令,通常是命令行命令。
先看一个例子:
define variable m1 as char no-undo.
define variable m2 as char no-undo.
input through dir.
repeat:
    import unformatted m1.
    message m1.
end.
input close. /*输出说有的dir结果*/


 input through value("ping 127.0.0.1").
 repeat:
     import unformatted m2.
     message m2.
 end.
 input close./*输出说有的ping结果*/

输出是一样的使用用法,当然你的操作系统命令应该是可以接受输入的命令,不然就没有意义了。
output through more.
message "hello".
output close.
这里的输出很快一闪而过。

4.和操作系统的交互
要执行操作系统下的命令,是由一系列的O打头的关键字来完成的。下面简要介绍一下:
opsys是一个函数,返回操作系统类型,目前(我使用的9.1E版本)只支持windows--返回值为"WIN32"和unix--返回值为"UNIX"。它的调用方式是不带括号的,比如yourop = opsys.
dos和unix是用来执行操作系统上的命令或者程序的。比如:dos notepad.会启动记事本程序。dos dir /p/w.或者dos value("dos dir /p/w").会执行dir命令。注意,value是一个关键字,但不是一个函数或者过程的名字。它是dos语句的一个属性。很多的语句都会有这个属性。另外要说的是,该语句说调用的程序是一个子进程,其实就相当于在命令行窗口下执行"notepad"或者"dir /p/w".如果命令行窗口不退出,该语句不会返回。
os-command,顾名思义执行os下的命令,和dos/unix差不多,但是你不用考虑操作系统的具体类型。但是你说调用的程序必须是两个操作系统下游共同的语法。它有一个no-wait选项,可以不管被调用程序的状态而立即返回。
os-copy,os-delete,os-append,os-create-dir,os-getenv(环境变量名),os-rename这些应该是望其名而知其义的。它们都有value选项。
os-drives是一个函数,返回逗号分割的驱动器符号列。它的调用也是不带括号的。在我的机器上其值为"c:;d:;x:;y:;".
os-error返回一个错误代码在你执行上边的命令后。如果是0则表示没有错误。具体的错误码可以查看帮助。


 


 

原创粉丝点击