2013-07-04 11 views
6

バイナリファイルから読み書きしようとしています。私はthisチュートリアルに従ってきました、そして、それは... txtファイルに物事を書いているようであることを除いて動作します。テスト時にtest.binというファイルに名前を付けましたが、メモ帳でそれを開いて適切に表示できるので、実際にはバイナリファイルだとは思いません。私はそれが "wb"と "rb"の権利を持つバイナリファイルだと言ってきましたか?バイナリファイルを読み書きする

if arg[1] == "write" then 
    local output = assert(io.open(arg[2], "wb")) 

    output:write(arg[3]) --3rd argument is written to the file. 

    assert(output:close()) 
elseif arg[1] == "read" then 
    local input = assert(io.open(arg[2], "rb")) 

    print(input:read(1)) --Should read one byte, not one char/int. Right? 
end 
+3

文字列を得ました。 – greatwolf

+0

おそらく、 'b'オプションなしでオープンされたテキストファイルを読み書きすることは' \ x1A ''charで止めることができます。これを避けるために、オプション 'b'が導入されました。 –

+0

http://www.cplusplus.com/forum/general/33808/この2番目の投稿は私のために明確になっています。私のC++クラスでは、バイナリファイルは完全に別のもので人間には読めないということを教えていたので、メモ帳で正しく読むことができたときに混乱しました。つまり、ほとんどのゲームのバイナリセーブファイルを開くと、認識できない完全なガベージとして表示されるので、紛失しているような気がします。 –

答えて

11

あなただけのファイルにASCII文字を書き込む場合は、それだけで罰金、メモ帳などのテキストエディタで開くことが可能になります。

local out = io.open("file.bin", "wb") 
local str = string.char(72,101,108,108,111,10) -- "Hello\n" 
out:write(str) 
out:close() 

結果のファイルが含まれています:

Hello 

一方、実際のバイナリデータ(たとえばランダムバイト)を書き込むと、ごみは次のようになります。

local out = io.open("file.bin", "wb") 
local t = {} 
for i=1,1000 do t[i] = math.random(0,255) end 
local str = string.char(unpack(t)) 
out:write(str) 
out:close() 

これはあなたが見たビデオゲームの保存ファイルに似ています。

あなたはまだそれを取得しない場合は、ファイルへ可能なすべてのオクテット書いてみる:

local out = io.open("file.bin", "wb") 
local t = {} 
for i=0,255 do t[i+1] = i end 
local str = string.char(unpack(t)) 
out:write(str) 
out:close() 

をしてから(ここで私は、Mac OS上で六角の悪鬼を使用)進エディタで開き対応確認するために:

ここ

hex

を、左側に、あなたは16進数でバイトを持っており、右側にあなたはそれらのテキスト表現を持っています。私は大文字Hを選択しました。左から見ると0x48に対応しています。 0x48はベース10の4 * 16 + 8 = 72です(それを示すスクリーンショットの一番下のバーを見てください)。

は、今私の最初のコード例を見て...小文字の電子ためのコードが何であるか

を推測し、最後にスクリーンショット(255バイト128)の最後の4行を見てください。これはあなたが見ていたゴミです。私は古いコンピュータと私の新しいゲーム上で作成

バイナリファイルに

を作成する方法を理解する私のレベルはいけない

0

することができますが、129

のあらゆるレベルでそれを 2200バイト読み込み、私はまだどのように私はXDATAでき理解していません(レベルデータ)テーブル はファイルに書き込むことができます。予想CHAR番号へ

 function xdatatoline (levelnumber,xdata) 
     local out = io.open("file.bin", "wb") 
     local t = xdata 
     --for i=1,1000 do t[i] = math.random(0,255) end 
     local str = string.char(unpack(t)) 
     out:write(str) 
     out:close() 
    end 

BAD ARGUMENT#1は、テキストファイルの*は*バイナリファイルの種類である)

関連する問題