2013-07-04 80 views
6

Tôi chỉ đang cố đọc/ghi từ tệp nhị phân. Tôi đã theo dõi this hướng dẫn, và nó hoạt động ... ngoại trừ nó có vẻ là viết những thứ vào một tập tin txt. Tôi đặt tên file test.bin khi kiểm tra nó, nhưng notepad có thể mở nó và hiển thị nó đúng cách, vì vậy tôi không nghĩ rằng nó thực sự là một tập tin nhị phân. Tôi đã nói với nó rằng đó là một tập tin nhị phân với "wb" và "rb" phải không?Đọc/Viết Tệp nhị phân

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

Một tập tin văn bản * là * một loại tập tin nhị phân. – greatwolf

+0

Có lẽ, đọc/ghi tệp văn bản được mở mà không có tùy chọn 'b' có thể dừng tại' '\ x1A'' char. Để tránh điều này, tùy chọn 'b' đã được giới thiệu. –

+0

http://www.cplusplus.com/forum/general/33808/ Bài đăng thứ hai trong những điều được làm rõ này cho tôi. Trong lớp C++ của tôi, chúng tôi được dạy rằng các tệp nhị phân là những thứ hoàn toàn riêng biệt, có nghĩa là không thể đọc được đối với con người, vì vậy tôi khá bối rối khi tôi có thể đọc nó đúng cách với notepad.Điều đó nói rằng, nếu bạn mở các tập tin nhị phân lưu của hầu hết các trò chơi, nó sẽ hiển thị như là rác hoàn toàn không thể nhận ra, vì vậy tôi không thể không cảm thấy như có một cái gì đó tôi đang mất tích. –

Trả lời

11

Nếu bạn chỉ viết các ký tự ASCII vào một tập tin, nó sẽ có thể để mở nó trong Notepad hoặc bất kỳ trình soạn thảo văn bản khác tốt:

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

Các tập tin kết quả sẽ bao gồm:

Hello 

Mặt khác, nếu bạn viết dữ liệu nhị phân thực (ví dụ: byte ngẫu nhiên), bạn sẽ nhận được rác:

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

Điều này tương tự như trò chơi video lưu các tệp bạn đã xem.

Nếu bạn vẫn không nhận được nó, cố gắng viết tất cả các octet có thể vào một tệp:

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

và sau đó mở nó bằng một trình soạn thảo hex (ở đây tôi sử dụng Hex Fiend trên Mac OS) để xem thư từ:

hex

ở đây, ở bên trái, bạn có byte trong hệ thập lục phân và bên phải bạn có biểu diễn văn bản của họ. Tôi đã chọn chữ hoa H, như bạn có thể thấy ở bên trái, tương ứng với 0x48. 0x48 là 4 * 16 + 8 = 72 trong cơ sở 10 (nhìn vào thanh dưới cùng của ảnh chụp màn hình cho bạn biết).

Bây giờ nhìn vào mã ví dụ đầu tiên của tôi và đoán những gì các mã cho chữ thường e là ...

Và cuối cùng nhìn vào 4 hàng cuối cùng của ảnh chụp màn hình (byte 128-255). Đây là rác bạn đang thấy.

0

Tôi không hiểu làm thế nào để viết tập tin nhị phân

mức tôi tạo ra trên máy tính cũ và trò chơi mới của tôi có thể đọc nó 2200 byte mọi cấp độ của 129

tôi vẫn không hiểu làm thế nào tôi có thể xdata (bảng dữ liệu mức) có thể ghi vào tập tin.

 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 LUAÄN # 1 đến số CHAR mong đợi, có string)

Các vấn đề liên quan