指定の場所にテキストを書き出すことができる。最後に”W”が付く。
目次
書き込みオプション
io.open (“filename”, “オプション”)
この関数は、文字列モードで指定されたモードでファイルを開きます。 新しいファイルハンドルを返します。エラーの場合は、nilとエラーメッセージを返します。
モード文字列は、次のいずれかになります。
- “r”:読み取りモード(デフォルト)。
- “w”:書き込みモード。
- “a”:追加モード。
- “r+”:更新モード。以前のすべてのデータが保持されます。(書き込みができない)
- “w+”:更新モード。以前のデータはすべて消去されます。(前のデータを消して書き直される)
- “a+”:更新モードを追加します。以前のデータは保持され、書き込みはファイルの最後でのみ許可されます。(前のデータを残して、その後に書き込まれる)
モード文字列の最後に「b」を付けることもできます。これは、一部のシステムでファイルをバイナリモードで開くために必要です。
ファイルの書き出し先の指定
X-Planeの最初のディレクトリに「TestWriteToFile.txt」ファイルが作成される。
file = io.open(“TestWriteToFile.txt”, “w”)
現在使用している機体のディレクトリに「TestWriteToFile.txt」ファイルが作成される。
file = io.open(AIRCRAFT_PATH..”TestWriteToFile.txt”, “w”)
X-Planeの中へのパスを自由に作成「TestWriteToFile.txt」ファイルが作成される。
local file = io.open (“/X-Plane 11/Resources/plugins/FlyWithLua/Scripts/missions.ini”,”W”)
Resourcesにluaファイルがあった場合のパスに「Tmissions.ini」ファイルが作成される。
INIファイルは、ソフトウェアの設定などを記録するために用いられるファイル形式の一つ。構造は単純なテキストファイルであり、設定ファイルのフォーマットとしてよく使われる。INIとはinitialization(イニシャライゼーション)の略であり、その他にconfiguration(コンフィギュレーション)の略である「.CFG」や「.conf」、あるいは「.TXT」なども使われる。つまりはtxtと同じファイルということになる。
local file = io.open (“./Resources/plugins/FlyWithLua/Scripts/missions.ini”,”W”)
luaファイルがあった場所からのパスに「missions.ini」ファイルが作成される。
local file = io.open (SCRIPT_DIRECTORY .. “/missions.ini”,”W”)
Windowsの場合のパスの書き方
“Resources\plugins\FlyWithLua\Scripts\”
全てのファイルを書き込む
下のようにTest.txtファイルを自動で作成して、テキストを書き込む作業になる。ファイルはFlyWithLuaのscriptディレクトリに出力されて書き込まれる。
いかのファイル、不安定。書き込みがあったり、なかったり。
type別に書き込むことができるようだが….
local Array1 = { {"Numbers",1,2,3,4,5}, {"Strings","a","b","c","d","e"}, {"Booleans", true, false}, "1234567890abcdefgh", 99, true } local NewArray = { } local write = true function ArrayTest() if write then local file = io.open(SCRIPT_DIRECTORY.."Test.txt", "w") --Test.txtファイルを書き出す。 --上のArray1をこのテキストに書き込む for i=1,#Array1 do if type(Array1[i]) == "table" then file:write("{") --このカッコも書き込む for l=1,#Array1[i] do --配列内にある行の数だけ書き込む if type(Array1[i][l]) == "number" then file:write(Array1[i][l]) end if type(Array1[i][l]) == "string" then file:write('"'..Array1[i][l]..'"') end if type(Array1[i][l]) == "boolean" then file:write(tostring(Array1[i][l])) end if l < #Array1[i] then file:write(",") end end file:write("}\n") --改行する else for name,val in ipairs(Array1) do file:write(name," = ",val) if i < #Array1 then file:write("\n") end end end end file:close() write = false end end do_often("ArrayTest()")
上のコードの26行目ぐらいまでは理解できるが、その後の部分がわからない。
ここで重要なのは、名前を格納できないため、配列に名前を付けないことです。 代わりに、この配列が格納するものに関する識別子は、サブ配列の最初の値として保存されます。 したがって、「Numbers = {1,2,3,4,5}」の代わりに、「{“Numbers”,1,2,3,4,5}」と書く必要があります。 保存ファイルのどこにどの値が保存されているかが正確にわかっている場合、これは実際には必要ありませんが、デバッグに役立ちます。
ファイルから配列をロードするには、読み取りプロセス中に各行を分析する必要があります。配列の開始区切り文字として「{」、値区切り文字として各「,」、終了区切り文字として「}」を使用します。
機体の名前を書き出す
機体のフォルダー内に「Mysave.txt」ファイルが書き出され、機体の名前がその仲に記述され保存される。
function writetofile() file = io.open(AIRCRAFT_PATH.."Mysave.txt", "w") file:write("-- File for: "..AIRCRAFT_FILENAME.." --\n") -- Write file header io.close(file) end do_often("writetofile()")
単純にテキストを書き込む(基本形)
X-Planeの最初のディレクトリに自動的にtextファイルを作成して、datarefの値をその中に書き込む。
単純にテキストを指定して書き込む。
1、2行目のテキストが書き込まれる。
data_1 = "ABCD" data_2 = "123457851" function data_test() file = io.open("dataTest.txt", "w") --X-Planeの最初のディレクトリに自動的にファイルが作成され書き込まれて保存される。 file:write(data_1, "\n") file:write(data_2, "\n") file:close() end do_every_frame("data_test()")
datarefの数値を取得して書き込む
-- open files dataref("FMC01L", "sim/cockpit2/radios/actuators/nav1_frequency_Mhz") dataref("FMC01S", "sim/cockpit2/radios/actuators/nav2_right_frequency_hz") function PetlaFMC() file = io.open("DaneDoFMC.txt", "w") --X-Planeの最初のディレクトリに自動的にファイルが作成され書き込まれて保存される。 file:write(FMC01L, "\n") file:write(FMC01S, "\n") file:close() end do_every_frame("PetlaFMC()")
条件付きファイルで、自動的に飛行機がロードされるようにする
おなじくdatarefを扱うが、機体を指定して書き出すファイル名を機体のファイル名にして出力する。
以下はC172を指定している。
-- dataref Variablen local ap_altitude = dataref_table("sim/cockpit/autopilot/altitude", "writable") local baro_setting = dataref_table("sim/cockpit/misc/barometer_setting", "writable") local baro_setting2 = dataref_table("sim/cockpit/misc/barometer_setting2", "writable") local hobbs_time = dataref_table("sim/time/hobbs_time", "writable") -- 機体ごとに異なるファイルを作成する local planeref = "C172" --Windowsの場合 local hobbs_filename = "Resources\\plugins\\FlyWithLua\\Scripts\\" .. planeref .. "_settings.txt" --Macの場合 local hobbs_filename = "Resources/plugins/FlyWithLua/Scripts/" .. planeref .. "_settings.txt" --planerefの中に機体名が入る -- 目的の値でファイルを作成する関数 function save_hobbstime() local hobbsfile = io.open(hobbs_filename, "w+") if (hobbsfile == nil) then --ファイルが空なら print("write error in save_hobbstime()") --Logファイルに出力さっる。save_hobbstime() での書き込みエラー return end hobbsfile:write(hobbs_time[0], "\n") hobbsfile:write(baro_setting[0], "\n") hobbsfile:write(baro_setting2[0], "\n") hobbsfile:write(ap_altitude[0], "\n") hobbsfile:close() end -- 上の関数を呼び出す save_hobbstime()
imgui.InputTextでの入力テキストを書き込む
InputTextを使ってテキストを入力して書き出す。
問題なくリアルタイムに書き出されるが、このままではX-Planeを再起動したり、FlyWithLuaを読み込み治すとテキストは消えてしまう。これは読み込みの機能が無いからである。
demo_wnd = float_wnd_create(200, 100, 1, true) float_wnd_set_title(demo_wnd, "imgui Demo") float_wnd_set_imgui_builder(demo_wnd, "build_demo") float_wnd_set_onclose(demo_wnd, "closed_demo") local data_1 = "" local data_2 = "" function build_demo(demo_wnd, x, y) file = io.open("dataTest.txt", "w") --X-Planeの最初のディレクトリに自動的にファイルが作成され書き込まれて保存される。 file:write(data_1, "\n") file:write(data_2, "\n") file:close() -- ユーザーがテキストを入力できるようにする。1行のみ。 local changed, newText_1 = imgui.InputText("Text-1", data_1, 255) -- Parameters: ラベル、現在のテキスト、許可される最大文字数 if changed then data_1 = newText_1 end local changed, newText_2 = imgui.InputText("Text-2", data_2, 255) -- Parameters: ラベル、現在のテキスト、許可される最大文字数 if changed then data_2 = newText_2 end end function closed_demo(demo_wnd) -- Tこの関数は、ユーザーがウィンドウを閉じるときに呼び出されます。 -- ウィンドウが既に破棄されているため、この関数では imgui 関数の描画または呼び出しは許可されない。 end