2013-07-04 47 views
6

Sto solo cercando di leggere/scrivere da un file binario. Ho seguito il tutorial this e funziona ... eccetto che sembra scrivere cose in un file txt. Ho chiamato il file test.bin durante il test, ma il blocco note può aprirlo e visualizzarlo correttamente, quindi non penso che sia in realtà un file binario. Ho detto che è un file binario con "wb" e "rb" giusto?Lettura/Scrittura di file binari

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

Un file di testo * è * un tipo di file binario. – greatwolf

+0

Probabilmente, la lettura/scrittura del file di testo aperto senza l'opzione 'b' può fermarsi al carattere' '\ x1A''. Per evitare ciò, è stata introdotta l'opzione 'b'. –

+0

http://www.cplusplus.com/forum/general/33808/ Il secondo post in questo chiarito per me. Nella mia classe C++, ci è stato insegnato che i file binari erano cose completamente separate, pensate per essere illeggibili per gli umani, quindi ero piuttosto confuso quando potevo leggerlo correttamente con il blocco note.Detto questo, se apri i file di salvataggio binari della maggior parte dei giochi, verrà visualizzato come una spazzatura irriconoscibile completa, quindi non posso fare a meno di pensare che ci sia qualcosa che mi manca. –

risposta

11

Se si scrive solo caratteri ASCII in un file, sarà possibile aprirlo in Blocco note o qualsiasi altro editor di testo più che bene:

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

Il file risultante conterrà:

Hello 

D'altra parte se si scrive i dati binari reali (ad esempio byte casuale) otterrete spazzatura:

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() 

Questo è simile a quei file di salvataggio di videogiochi che hai visto.

Se ancora non capisco, provare a scrivere tutte le possibili ottetti in un file:

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() 

e poi aprirlo con un editor esadecimale (qui ho usato Hex Fiend su Mac OS) per vedere le corrispondenze:

hex

Qui, sulla sinistra, si hanno i byte in esadecimale e sulla destra hai la loro rappresentazione del testo. Ho selezionato il maiuscolo H che, come puoi vedere a sinistra, corrisponde a 0x48. 0x48 è 4 * 16 + 8 = 72 nella base 10 (guarda la barra in basso dello screenshot che ti dice che).

Ora guardate al mio primo esempio di codice e indovinate un po 'il codice per minuscola e è ...

Ed infine un'occhiata alle ultime 4 righe della schermata (byte 128 a 255). Questa è la spazzatura che stavi vedendo.

0

Non capisco come scrivere file binari

miei livelli creati su computer vecchio e il mio nuovo gioco lattina legge 2200 byte ogni livello di 129

io ancora non capisco come posso xdata (dati di livello) la tabella può scrivere su file.

 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 ARGOMENTO # 1 al numero di CHAR previsto, ha ottenuto string)