Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4739999
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类:

2010-08-23 22:21:09

控制台io库提供标准输入输出,文件流操作函数

io.库(内核库)
io.open()//显示控制台窗口
io.close()//关闭控制台窗口

io.exist()//判断文件是否存在

io.fullpath("")//将相对路径转为相对路径(\开始表示AAuto程序根目录)

io.rename("","")//重命名,成功返回ture,失败返回null

io.remove("")//删除指定的文件,成功返回ture,失败返回null

io.splitpath()//拆分文件路径为目录、文件名、后缀名、分区号等

io.tmpname()//生成临时文件

io.gethwnd()//返回控制台窗口句柄


打开文件

用io.open以独占模式打开「外部文件」创建新的输入输出流并返回文件对象。

string库的string.load,string.save函数提供简单易用的文件读写、追加功能,并且是以共享模式打开文件,而io.open是以独占模式打开文件。


file = io.open (filename [, mode])

// filename指定文件名(),mode参数可选的格式如下:


io.open("")//创建临时文件(文件名为空则创建可读写的临时文件)
io.open("","a")//以追加模式打开文件(如希望打开文件用于写,又不要删除原文件中的数据,并从原文件的末尾开始添加新的数据,应该使用此模式)
io.open("","a+")//打开或创建可读写文件
io.open("","r")//以只读模式打开文件(默认模式)
io.open("","r+")//打开可读写文件(该文件必须存在。写入的数据会被加到文件尾后。)
io.open("","w")//以写模式打开文件
io.open("","w+")//以附加方式打开或创建可读写文件

附加标致:

模式后添加t表示以文本模式访问,添加b表示以二进制模式访问。
例如 "rb" 表示以二进制读模式打开文件。

1、a,w,r等只能出现在第一个标记
用a+ w+ r+表示扩展的属性,如r+表示可读写,而不是rw

2、可使用ccs标记指定编码,
如 str = string.load(str,"c:\\test.txt","r,ccs=UTF-8")
将UTF8编码的test.txt读入并转换为标准UNICODE编码

如果输入错误的标记会弹出错误提示,而不是程序崩溃。
','号后面的指定编码部份如果写错了,将会导致程序崩溃。


如果需要在打开文件时自动捕获错误,可以这样写:

//io.open在打开文件失败时会返回两个参数: null,错误信息
//而assert函数在接收的第一个参数为null时断言失败,并会将第二个参数作为错误信息抛出异常
var file = assert(io.open("nofile.txt", "rb") )



文件操作(file)

io.stdout//标准输出对象(file)。

  io.stdout.close()/*关闭文件流

关闭文件
file.close() 关闭使用io.open打开的文件file对象。

  io.stdout.flush()/*输出缓冲区数据

输出缓冲
file:flush()
输入缓冲区内容到文件中,以保存对文件的修改。
通常写入的内容在调用file.flush函数或者file.close函数才会保存到文件中。


******************************************************************************

读文件
file.read(...)

read函数从当前输入文件读取串,由它的参数控制读取的内容。
参数可以有多个,参数要设置的选项如下:

  io.stdout.read("%d")/*读取数字

int = io.read("%d"): 从串中转换出数值


函数从当前输入文件中读取出一个数值(而不是字符串)
当需要从一个文件中读取大量数字时,数字间的字符串为空白可以显著的提高执行性能。
%d选项会跳过两个可被识别数字之间的任意空格。这些可识别的字符串可以是-3, +5.2,1000,和 -3.4e-23。
如果在当前位置找不到一个数字(由于格式不对,或者是到了文件的结尾),
则返回null 

可以对每个参数设置选项,函数将返回各自的结果。例如:
n1,n2,n3 = file.read("%d","%d","%s"):

  io.stdout.read("%s")/*读取下一行

str = file.read("%s"): 读取下一行文本 

函返回当前输入文件的下一行(不包含最后的换行符)。
当到达文件末尾,返回值为null(表示没有下一行可返回)。
该读取方式是read函数的默认方式,所以可以简写为file.read()

  io.stdout.read(0)/*检测是否读取到文件尾

str = file.read(0)

用来测试是否到达了文件末尾。如果不是返回一个空串,如果已是文件末尾返回null。

  io.stdout.read(-1)/*读取全部数据

str = file.read(-1):

函数从当前位置读取整个输入文件。
如果当前位置在文件末尾,或者文件为空,函数将返回空串。


  io.stdout.read(_)/*指定读取n个字节

str = file.read(n)


read函数将尝试从输入文件中读取n个字符。
如果无法读取到任何字符(已经到了文件末尾),函数返回nil。否则返回一个最多包含n个字符的串。

  io.stdout.read()/*读取下一行


分行迭代读取文件

io.lines// 逐行迭代读取文件(输入文件绝对路径) 例:

分行迭代读取文件

for line in io.lines("\") {}


 下面是在控制台使用io.lines的示例:

io.open()//打开控制台
io.print("您可以输入AAuto代码回车运行
输入exit并回车退出"
);

for line in io.lines( ) { 
    if(string.lower(line)=="exit")break;
    try{//容错语句
     io.print( loadcode(line)() );//执行用户输入的AAuto代码
    }
    catch(e){//捕获错误信息
     io.print(e)
    } 
} io.close()


io.lines自动打开通过file参数指定路径的文件。

file参数也可以是使用io.open打开的文件对象,省略file参数则使用默认值io.stdin。

io.lines创建一个, 支持在循环中逐行读取文件,在读取完毕以后自动关闭文件对象。使用io.lines可以避免一次性读取太大的文件。  

io.open();//打开控制台窗口

for line in io.lines("d:\test.txt") { 
//io.lines()返回的迭代器函数每次读取文件中的一行 
    io.print(line);
}



使用 file.read函数可以实现类似的功能:

io.open();//打开控制台窗口

file = io.open("d:\test.txt")

line = file.read();//读取下一行
while( line ) {
    io.print(line);
    line = file.read();//读取下一行
}

file.close(); 





设置缓冲区

file.setvbuf (mode [, size]) 

设置写入文件流使用的缓冲区,
第一个参数指定缓冲区模式,支持以下三种模式:

"no": 无缓冲区.
"full": 使用完全缓冲
"line": 使用行缓冲

第二个参数指定缓冲区大小。

  io.stdout.setvbuf("line",)/*行缓冲

  io.stdout.setvbuf("full",_)/*完全缓冲

  io.stdout.setvbuf("no")/*禁用缓冲



移动文件指针

file.seek(whence="cur",offset=0)

offset指定偏移量。
whence参数指定偏移方式,offset指定偏移量。
返回值为读写指针的当前位置。 

whence参数可选项如下:

"set",偏移值是从文件头开始;

.....


  io.stdout.seek("cur",_)/*移动至相对当前位置的指定偏移量(偏移值从当前位置开始)

  io.stdout.seek("end",_)/*移动至相对结束处的指定偏移量

  io.stdout.seek("end")/*移动指针至结束处(偏移值从文件尾往前计数)

  io.stdout.seek("set",_)/*移动至相对开始处的指定偏移量

  io.stdout.seek("set")/*移动指针至开始(偏移值是从文件头开始)

  io.stdout.seek()/* 得到当前位置

whence的默认值为"cur",offset的默认值为0。
offset = file.seek()得到的返回值就是文件当前的存取位置,且保持位置不变。
file.seek("set")就是将文件的存取位置重设到文件开头。
而offset = file.seek("end")就是将位置设为文件尾,同时就可以得到文件的大小。

如果需要得到文件的大小又不改变读写指针的位置,可以这样写

var current = file.seek() //得到读写指针当前位置 

var size = file.seek("end") //得到文件大小 

file.seek("set", current) //恢复读写指针当前位置


  io.stdout.write(_, )/*写数据,支持一个或多个参数

  io.stdout.write()/*写数据,支持一个或多个参数

写文件
file.write(...);

file.write获取任意数目的数字或字符串参数,接着将它们写入到输出文件流。



file = io.open(""); 

file.write("hello" + "world"); //不建议使用字符串连接

file.write("hello", "world"); //直接用多个参数更快更好


io.stdin//标准输入对象(file)。 

  。。。。

io.stderr//标准错误输出对象(file)。

  。。。。。


管道

io.popen("","r")//创建一个进程打开目标程序并绑定目标进程输出流
io.popen("","w")//创建一个进程打开目标程序并绑定目标进程输入流
io.popen("")//等价于io.popen("","r")例file=io.popen("ipconfig/all")

如 io.popen (prog , mode = "r" )

您是否希望运行控制台程序,并且得到返回的内容呢?以前我们使用DOS重定向输入命令输出到文件再读取。
现在,我们可以使用popen方法以一个子进程来运行一个命令,并且把这个进程的标准输入和标准输出绑定到模拟精灵的IO对象。向IO对象写数据,子进程就可以从它的标准输入读取数据,而子进程输出的数据,也可以通过AAuto的IO对象读出来

= io.popen("ipconfig /all" )
str = f.read( -);
f.close();

io.open(); //打开控制台
io.print(str); //输出



轻松读取了 ipconfig返中的全部数据


io.print( var [,var2 , ... , varn])

这个函数类似io.stdout.write向标准输出流写入信息。
但是io.print支持任意的数据类型(自动调用tostring函数并转换为字符串)。
io.print会在参数之间自动添加制表符,输出所有的参数以后自动添加换行符。
而io.stdout.write不附加任何额外的字符到输出中去。

阅读(2923) | 评论(0) | 转发(1) |
0

上一篇:QQ2010登陆器

下一篇:循环语句练习FOR

给主人留下些什么吧!~~