[Solved] Read Memory Stream form findTableFile?

TheyCallMeTim13

I... am an enchanter.
Talents
Fearless Donors
Mar 3, 2017
329
14
18
#1
I'm am trying to read a table file, right now I just save it to disc then read file as normal, but how do I read the memory stream directly?
 

TheyCallMeTim13

I... am an enchanter.
Talents
Fearless Donors
Mar 3, 2017
329
14
18
#2
So kinda figured it out

Code:
local file = findTableFile('test.cea')

local lst = getPropertyList(file)
for i = 1, lst.Count - 1 do
	print(lst[i])
end

local stream = file.getData()
print(stream)

local bytes = stream.read(stream.Size)
for i = 1, #bytes do
	print(bytes[i], string.char(bytes[i]))
end
Gives me this output:
Code:
stream 
0EBD9B90 
47 / 
47 / 
47 / 
47 / 
32   
67 C 
69 E 
65 A 
32   
116 t 
101 e 
115 s 
116 t 
32   
102 f 
105 i 
108 l 
101 e 
13 
 
10
So I think this is the start of what I needed.
 
Mar 3, 2017
31
0
6
#3
The returned byte table can be convert to string with ce function byteTableToString
eg.
Code:
local bytes = stream.read(stream.Size)
local str = byteTableToString(bytes)
or use a stringStream which need not create intermediate Lua byte table (for performance?).
Code:
function GetTableFileAsString(tfName)
  local tf = findTableFile(tfName)
  if tf then
    local ss = createStringStream()
    ss.copyFrom(tf.Stream,tf.Stream.Size)
    local ret = ss.DataString
    ss.Destroy()
    return ret
  end
end
print(GetTableFileAsString("insert-table-file-name"))
ps: if DB make .DataString work with MemoryStream, it will be just a property instead of custom function.

bye~
 

TheyCallMeTim13

I... am an enchanter.
Talents
Fearless Donors
Mar 3, 2017
329
14
18
#4
Thank you that's much nicer than what I had.
 

TheyCallMeTim13

I... am an enchanter.
Talents
Fearless Donors
Mar 3, 2017
329
14
18
#5
hum..

This is what I had not sure which is cleaner..
Code:
local stream = tableFile.getData()
local fileStr = nil
local bytes = stream.read(stream.Size)
for i = 1, #bytes do
	if fileStr == nil then
		fileStr = ''
	end
	fileStr = fileStr .. string.char(bytes[i])
end
EDIT:
Ended up using yours..
Code:
if tableFile then
	local ss = createStringStream()
	ss.copyFrom(tableFile.Stream,tableFile.Stream.Size)
	local fileStr = ss.DataString
	ss.Destroy()
end
Definitely looks better!
 

TheyCallMeTim13

I... am an enchanter.
Talents
Fearless Donors
Mar 3, 2017
329
14
18
#6
Though I think mine has places to fail.

Now Do I need to destroy the stream, I wouldn't think so, but if the stream is just some copy of the file memory then I mite need to?

I ask because of the destroy call on the return from createStringStream.
 

Eric

Administrator
Administrator
Mar 2, 2017
39
0
6
#7
the stringstream is a different object than the tablefile. It just contains a copy after you made the copy, so you're free to destroy it