2013-07-04 7 views
6

मैं बस एक बाइनरी फ़ाइल से पढ़ने/लिखने की कोशिश कर रहा हूं। मैं this ट्यूटोरियल का पालन कर रहा हूं, और यह काम करता है ... सिवाय इसके कि यह एक txt फ़ाइल में चीजें लिख रहा है। मैंने परीक्षण करते समय फ़ाइल test.bin नाम दिया, लेकिन नोटपैड इसे खोल सकता है और इसे ठीक से प्रदर्शित कर सकता है, इसलिए मुझे नहीं लगता कि यह वास्तव में एक बाइनरी फ़ाइल है। मैंने यह बताया है कि यह "wb" और "आरबी" सही के साथ एक बाइनरी फ़ाइल है?पढ़ना/लिखना बाइनरी फाइलें

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' विकल्प के बिना खोला गया टेक्स्ट फ़ाइल पढ़ना/लिखना '' x_A'' char 'पर रोक सकता है। इससे बचने के लिए, विकल्प 'बी' पेश किया गया था। –

+0

http://www.cplusplus.com/forum/general/33808/ मेरे लिए इस स्पष्ट चीजों में दूसरी पोस्ट। मेरी सी ++ कक्षा में, हमें सिखाया गया था कि बाइनरी फाइलें पूरी तरह से अलग चीजें थीं, जिसका मतलब मनुष्यों के लिए अपठनीय होना था, इसलिए जब मैं इसे नोटपैड के साथ ठीक से पढ़ सकता था तो मैं उलझन में था।उस ने कहा, यदि आप अधिकांश खेलों की बाइनरी सेव फाइलें खोलते हैं, तो यह पूरी तरह से अपरिचित कचरा के रूप में दिखाई देगा, इसलिए मैं मदद नहीं कर सकता लेकिन ऐसा लगता है कि मुझे कुछ याद आ रहा है। –

उत्तर

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

हेक्साडेसिमल संपादक के साथ इसे खोलने (यहाँ मैं मैक ओएस पर हेक्स लेनेवाला इस्तेमाल किया है) और फिर:

आप अभी भी यह नहीं मिलता है, एक फाइल करने के लिए सभी संभव ओक्टेट्स लिखने की कोशिश पत्राचार को देखने के लिए:

hex

यहाँ, बाईं तरफ, आप बाइट्स हेक्साडेसिमल में और सही आप उनके पाठ प्रतिनिधित्व पर है। मैंने अपरकेस एच चुना है, जैसा कि आप बाईं ओर देख सकते हैं, 0x48 से मेल खाता है। 0x48 आधार 10 में 4 * 16 + 8 = 72 है (स्क्रीनशॉट के निचले पट्टी को देखें जो आपको बताता है)।

अब मेरा पहला कोड उदाहरण को देखो और लगता है कि क्या के लिए लोअरकेस कोड है ...

और अंत में स्क्रीनशॉट (बाइट्स 128 से 255) के 4 पिछले पंक्तियां देखें। यह वह कचरा है जिसे आप देख रहे थे।

0

मुझे समझ में कैसे बाइनरी फ़ाइलें

मेरे स्तरों पुराने कंप्यूटर पर बनाई लिखने के लिए और अपने नए खेल कर सकते हैं यह 2200 बाइट्स 129

के हर स्तर पढ़ता है मैं अभी भी समझ में नहीं आता मैं कैसे कर सकते हैं न xdata (स्तर डेटा) तालिका फ़ाइल में लिख सकते हैं।

 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 

खराब ARGUMENT # 1 CHAR संख्या की संभावना है, स्ट्रिंग मिला)

संबंधित मुद्दे