在c语言中输入操作是由库函数(Step By Step(Lua输入输出库) Stephen_Liu 博客园)
I/O库为文件操作提供了两种不同的模型 ,简单模型和完整模型 。简单模型假设一个当前输入文件和一个当前输出文件 ,他的I/O操作均作用于这些文件 。完整模型则使用显式的文件句柄 ,并将所有的操作定义为文件句柄上的方法。
1. 简单模型: I/O库会将进程标准输入输出作为其缺省的输入文件和输出文件 。我们可以通过io.input(filename)和io.output(filename)这两个函数来改变当前的输入输出文件 。
1). io.write函数:
函数原型为io.write(...) 。该函数将所有参数顺序的写入到当前输出文件中 。如:
io.write("hello","world") --写出的内容为helloworld2). io.read函数:
下表给出了该函数参数的定义和功能描述: 参数字符串 含义 "*all" 读取整个文件 "*line" 读取下一行 "*number" 读取一个数字 <num> 读取一个不超过<num>个字符的字符串调用io.read("*all")
会读取当前输入文件的所有内容 ,以当前位置作为开始 。如果当前位置处于文件的末尾 ,或者文件为空 ,那个该调用返回一个空字符串 。由于Lua可以高效的处理长字符串 ,因此在Lua中可以先将数据从文件中完整读出 ,之后在通过Lua字符串库提供的函数进行各种处理 。
调用io.read("*line")会返回当前文件的下一行 ,但不包含换行符 。当到达文件末尾时,该调用返回nil 。如:如果只是为了迭代文件中的所有行 ,可以使用io.lines函数,以迭代器的形式访问文件中的每一行数据 ,如:
调用io.read("*number")会从当前输入文件中读取一个数字 。此时read将直接返回一个数字,而不是字符串 。"*number"选项会忽略数字前面所有的空格 ,并且能处理像-3 、+5.2这样的数字格式。如果当前读取的数据不是合法的数字 ,read返回nil 。在调用read是可以指定多个选项 ,函数会根据每个选项参数返回相应的内容 。如:
调用io.read(<num>)会从输入文件中最多读取n个字符 ,如果读不到任何字符 ,返回nil。否则返回读取到的字符串 。如:
io.read(0)是一种特殊的情况 ,用于检查是否到达了文件的末尾 。如果没有到达 ,返回空字符串 ,否则nil 。
2. 完整I/O模型:
Lua中完整I/O模型的使用方式非常类似于C运行时库的文件操作函数 ,它们都是基于文件句柄的 。
1). 通过io.open函数打开指定的文件,并且在参数中给出对该文件的打开模式 ,其中"r"表示读取 ,"w"表示覆盖写入,即先删除文件原有的内容 ,"a"表示追加式写入 ,"b"表示以二进制的方式打开文件 。在成功打开文件后,该函数将返回表示该文件的句柄 ,后面所有基于该文件的操作 ,都需要将该句柄作为参数传入 。如果打开失败 ,返回nil 。其中错误信息由该函数的第二个参数返回 ,如:
assert(io.open(filename,mode)) --如果打开失败 ,assert将打印第二个参数给出的错误信息 。2). 文件读写函数read/write 。这里需要用到冒号语法 ,如:
此外 ,I/O库还提供了3个预定义的文件句柄 ,即io.stdin(标准输入) 、io.stdout(标准输出)、io.stderr(标准错误输出)
。如:
io.stderr:write("This is an error message.") 事实上,我们也可以混合使用简单模式和完整模式 ,如:3). 性能小技巧:
由于一次性读取整个文件比逐行读取要快一些 ,但对于较大的文件,这样并不可行 ,因此Lua提供了一种折中的方式 ,即一次读取指定字节数量的数据,如果当前读取中的最后一行不是完整的一行 ,可通过该方式将该行的剩余部分也一并读入 ,从而保证本次读取的数据均为整行数据 ,以便于上层逻辑的处理 。如:
local lines,rest = f:read(BUFSIZE,"*line") --rest变量包含最后一行中没有读取的部分。 下面是Shell中wc命令的一个简单实现 。4). 其它文件操作:
如io.flush函数会将io缓存中的数据刷新到磁盘文件上 。io.close函数将关闭当前打开的文件。io.seek函数用于设置或获取当前文件的读写位置 ,其函数原型为f:seek(whence,offset) ,如果whence的值为"set" ,offset的值则表示为相对于文件起始位置的偏移量 。如为"cur"(默认值),offset则为相对于当前位置的偏移量 ,如为"end" ,则为相对于文件末尾的偏移量 。函数的返回值与whence参数无关 ,总是返回文件的当前位置,即相对于文件起始处的偏移字节数 。offset的默认值为0 。如:最后需要指出的是 ,如果发生错误 ,所有这些函数均返回nil和一条错误信息 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!