Lua fail I/O


Pustaka Lua I/O untuk membaca dan memproses fail. Ia dibahagikan kepada mod mudah (sama seperti C) dan mod lengkap.

  • Model ringkas mempunyai fail input semasa dan fail output semasa dan menyediakan operasi yang berkaitan dengan fail ini.

  • Model lengkap dilaksanakan menggunakan pemegang fail luaran. Ia mentakrifkan semua operasi fail sebagai kaedah pemegang fail dalam bentuk berorientasikan objek

Mod ringkas lebih sesuai apabila melakukan beberapa operasi fail mudah. Tetapi apabila melakukan beberapa operasi fail lanjutan, mod mudah nampaknya tidak mencukupi. Sebagai contoh, untuk operasi seperti membaca berbilang fail pada masa yang sama, adalah lebih sesuai untuk menggunakan mod penuh.

Pernyataan operasi fail pembukaan adalah seperti berikut:

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

Nilai mod ialah:

模式描述
r以只读方式打开文件,该文件必须存在。
w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
r+以可读写方式打开文件,该文件必须存在。
w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a+与a类似,但此文件可读可写
b二进制模式,如果文件是二进制文件,可以加上b
+号表示对文件既可以读也可以写

Mod ringkas

Mod ringkas menggunakan I/O standard atau menggunakan satu fail input semasa dan satu fail output semasa.

Berikut ialah kod fail.lua Fail yang akan dikendalikan ialah test.lua (anda perlu mencipta fail ini jika ia tidak wujud seperti berikut:

-- 以只读方式打开文件
file = io.open("test.lua", "r")

-- 设置默认输入文件为 test.lua
io.input(file)

-- 输出文件第一行
print(io.read())

-- 关闭打开的文件
io.close(file)

-- 以附加的方式打开只写文件
file = io.open("test.lua", "a")

-- 设置默认输出文件为 test.lua
io.output(file)

-- 在文件最后一行添加 Lua 注释
io.write("--  test.lua 文件末尾注释")

-- 关闭打开的文件
io.close(file)

Laksanakan kod di atas dan anda akan mendapati bahawa output Baris pertama maklumat dalam fail test.ua ditukar dan komen lua ditambahkan pada baris terakhir fail. Sebagai contoh, output di sini ialah:

-- test.lua 文件

Dalam contoh di atas, kami menggunakan kaedah io."x", yang mana kami tidak mengambil parameter dalam io.read(). jadual berikut:

模式描述
"*n"读取一个数字并返回它。例:file.read("*n")
"*a"从当前位置读取整个文件。例:file.read("*a")
"*l"(默认)读取下一行,在文件尾 (EOF) 处返回 nil。例:file.read("*l")
number返回一个指定字符个数的字符串,或在 EOF 时返回 nil。例:file.read(5)

Kaedah io lain ialah:

  • io.tmpfile():Mengembalikan pemegang fail sementara Fail dibuka dalam mod kemas kini dan secara automatik apabila program Tamat >io .flush():

    Menulis semua data dalam penimbal ke fail
  • io.lines(nama fail pilihan):

    Mengembalikan lelaran fungsi, setiap Panggilan ini akan mendapat baris kandungan dalam fail Apabila penghujung fail dicapai, tiada akan dikembalikan, tetapi fail tidak akan ditutup
  • <🎜. >Mod penuh

    Biasanya kami memerlukan Memproses berbilang fail pada masa yang sama. Kita perlu menggunakan file:function_name dan bukannya kaedah io.function_name. Contoh berikut menunjukkan cara memproses fail yang sama pada masa yang sama:
  • -- 以只读方式打开文件
    file = io.open("test.lua", "r")
    
    -- 输出文件第一行
    print(file:read())
    
    -- 关闭打开的文件
    file:close()
    
    -- 以附加的方式打开只写文件
    file = io.open("test.lua", "a")
    
    -- 在文件最后一行添加 Lua 注释
    file:write("--test")
    
    -- 关闭打开的文件
    file:close()
  • Laksanakan kod di atas, anda akan mendapati bahawa baris pertama maklumat fail test.ua adalah output, dan komen lua ialah ditambahkan pada baris terakhir fail. Sebagai contoh, output di sini ialah:

    -- test.lua 文件
    Parameter bacaan adalah konsisten dengan mod ringkas.

    Kaedah lain:

fail:seek(pilihan dari mana, pilihan offset):

Tetapkan dan dapatkan kedudukan fail semasa, dan kembalikan yang terakhir jika lokasi fail berjaya (dalam bait), mengembalikan mesej ralat sifar tambah jika gagal. Nilai parameter dari mana boleh:

Tanpa fail parameter:seek() mengembalikan kedudukan semasa, file:seek("set") mencari pengepala fail, file:seek("end") mencari The end daripada fail dan mengembalikan saiz fail

"set": Mulakan dari permulaan fail
  • "cur": Mulakan dari kedudukan semasa [ Lalai]

    "end": Mulakan dari hujung fail
    • offset: Lalai ialah 0

    • file:flush():
    • Tulis semua data dalam penimbal ke fail

    • io.lines(nama fail pilihan):

      Buka nama fail yang ditentukan dalam mod baca dan kembalikan fungsi lelaran Setiap panggilan akan memperoleh baris kandungan dalam fail Apabila penghujung fail dicapai, tiada dikembalikan dan fail akan ditutup secara automatik.
    • Jika tiada parameter digunakan, io.lines() <=> io.input():lines();
    for line in io.lines("main.lua") do
    
      print(line)
    
      end
  • Contoh berikut menggunakan kaedah cari, mencari kedudukan ke-25 dari bahagian bawah fail dan menggunakan *parameter kaedah baca, iaitu membaca keseluruhan fail dari kedudukan semasa (kedudukan ke-25 dari bawah).

    -- 以只读方式打开文件
    file = io.open("test.lua", "r")
    
    file:seek("end",-25)
    print(file:read("*a"))
    
    -- 关闭打开的文件
    file:close()

    Hasil keluaran di sini ialah:
  • st.lua 文件末尾--test