2013-07-04 43 views
6

Po prostu próbuję odczytać/zapisać z pliku binarnego. Podążałem za tutorialem this i działa ... chyba że pisze coś do pliku txt. Podczas testowania nazwałem plik test.bin, ale notatnik może go otworzyć i wyświetlić poprawnie, więc nie sądzę, że jest to plik binarny. Powiedziałem, że jest to plik binarny z "wb" i "rb", prawda?Odczytywanie/zapisywanie plików binarnych

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

Plik tekstowy * jest * typ pliku binarnego. – greatwolf

+0

Prawdopodobnie odczytywanie/zapisywanie pliku tekstowego otwartego bez opcji 'b' może zatrzymać się na' '\ x1A'' char. Aby tego uniknąć, wprowadzono opcję "b". –

+0

http://www.cplusplus.com/forum/general/33808/ Drugi post w tym wyjaśnił rzeczy dla mnie. W mojej klasie C++ uczono nas, że pliki binarne są całkowicie oddzielnymi rzeczami, które miały być nieczytelne dla ludzi, więc byłem raczej zdezorientowany, kiedy mogłem odczytać go poprawnie za pomocą notatnika.To powiedziawszy, jeśli otworzysz binarne pliki zapisu większości gier, pojawią się one jako kompletne nierozpoznawalne śmieci, więc nie mogę pomóc, ale czuję, że czegoś brakuje. –

Odpowiedz

11

Jeśli tylko napisać znaki ASCII do pliku, to będzie możliwe, aby otworzyć go w Notatniku lub innym edytorze tekstowym dobrze:

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

Plik wynikowy będzie zawierał:

Hello 

z drugiej strony, jeśli piszesz rzeczywiste dane binarne (na przykład losowych bajtów) dostaniesz śmieci:

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

Jest to podobne do tych zapisanych plików gier wideo, które widziałeś.

Jeśli nadal nie rozumiem, spróbuj napisać wszystkie możliwe oktety do pliku:

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

a następnie otworzyć go w edytorze szesnastkowym (tutaj użyłem Hex Fiend na Mac OS) zobaczyć odpowiedniki:

hex

Tu, po lewej stronie, trzeba bajtów w systemie szesnastkowym i po prawej masz swoją reprezentację tekstową. Wybrałem wielkie litery H, które, jak widać po lewej, odpowiadają 0x48. 0x48 to 4 * 16 + 8 = 72 w podstawie 10 (spójrz na dolny pasek ekranu, który mówi, że).

Spójrzmy teraz na moim pierwszym przykładzie kodu i zgadnijcie co kod dla małymi e jest ...

I wreszcie spojrzeć na 4 ostatnie wiersze screenie (bajty 128 do 255). To są śmieci, które widziałeś.

0

ja nie rozumiem jak pisać plików binarnych

moich poziomów stworzony na starym komputerze i moja nowa gra może czyta 2200 bajtów każdy poziom 129

ja nadal nie rozumiem, jak mogę xdata (dane poziomu) tabela może pisać do pliku.

 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 

błędny argument nr 1 do numeru CHAR oczekiwaniami dostał ciąg)