Page 1 of 2

How to save entire contents of a table to a text file?

Posted: Mon Oct 29, 2012 3:13 pm
by Mario-Fan
I'm attempting to make a game that's a bit like Guitar Hero. It's currently at a very basic stage with no real eye candy. For the level editor I'm going to be using, I'm going to want to save the entire contents of four tables to a text file. Thing is, with the methods I've tried, it only saves the last item in the table. I haven't coded the editor yet, but I have coded it to save the file format of the music used (so far it only recognises WAV, MP3 and OGG because I don't really know of any others, which is another question I'd like answered since the wiki doesn't list all of them) in the same file, and using testing values, I have noticed that I couldn't find it in the huge database that is my knowledge and would like some help. (To think that I thought I'd be able to make this without asking you guys for help. Note to self, never think that thought again -_-) Here's the code. I put in Gangam Style so that I could test the level editor and gameplay when I put them in.
asdfhero.love
So incomplete it doesn't even have gameplay, only menus :P
(2.82 MiB) Downloaded 165 times
EDIT: Oh and did I mention it freezes at startup if it's made song.txt in the appdata folder.

Re: How to save entire contents of a table to a text file?

Posted: Mon Oct 29, 2012 4:36 pm
by spir
You'll find a complete discussion of the topic (I mean your thread title) and its problems in the online Lua manual (it's for lua 2.0, but still mostly up-to-date).

manual: http://www.lua.org/pil/#online

serialisation: http://www.lua.org/pil/12.html

A few questions:

1. Are the keys all ids (strings)?

2. What are the values?

3. Are there table values? If yes, you'll need a recursive func to serialise sub-tables.

4. If yes, are there possible shared tables? If yes, to avoid multiple serialisation, you need a way to identify shared (sub-)tables, namely their names.

5. If yes, are there possible cycles? If yes, same thing.

You can easily write a table serialisation func covering sub-tables (point 3.) and keeping a list of already-seen tables (references, in fact), then when meeting one write an erroneous placeholder such as "<shared>" which will cause an error on reloading and tell you about the issue.
More help if needed.

I don't understand much about the rest of your post...

Denis

Re: How to save entire contents of a table to a text file?

Posted: Mon Oct 29, 2012 4:52 pm
by Mario-Fan
spir wrote:You'll find a complete discussion of the topic (I mean your thread title) and its problems in the online Lua manual (it's for lua 2.0, but still mostly up-to-date).

manual: http://www.lua.org/pil/#online

serialisation: http://www.lua.org/pil/12.html

A few questions:

1. Are the keys all ids (strings)?

2. What are the values?

3. Are there table values? If yes, you'll need a recursive func to serialise sub-tables.

4. If yes, are there possible shared tables? If yes, to avoid multiple serialisation, you need a way to identify shared (sub-)tables, namely their names.

5. If yes, are there possible cycles? If yes, same thing.

You can easily write a table serialisation func covering sub-tables (point 3.) and keeping a list of already-seen tables (references, in fact), then when meeting one write an erroneous placeholder such as "<shared>" which will cause an error on reloading and tell you about the issue.
More help if needed.

I don't understand much about the rest of your post...

Denis
Erm, I want the program to put numbers into the tables in the text file and then be able to load them. I want it to save the times in the song when you have to press a button, if that makes any sense. I tend not to think about programming terms since I don't discuss programming all that much because most of the people from the forum I come from that have any good experience in programming use other languages, so I don't really understand most of your post. What I do understand is that in this game, I'm not planning on having tables in tables and that I want number values in the tables, not strings.

Re: How to save entire contents of a table to a text file?

Posted: Mon Oct 29, 2012 9:49 pm
by spir
Mario-Fan wrote: Erm, I want the program to put numbers into the tables in the text file and then be able to load them. I want it to save the times in the song when you have to press a button, if that makes any sense. I tend not to think about programming terms since I don't discuss programming all that much because most of the people from the forum I come from that have any good experience in programming use other languages, so I don't really understand most of your post. What I do understand is that in this game, I'm not planning on having tables in tables and that I want number values in the tables, not strings.
Then, it should be far easier. If you want to edit the file content by program, then maybe do not indent the text. Something like:

Code: Select all

write_table = function (t)
   print ("{")
   for k,v in pairs(t) do
      print(k .. " = " .. v .. " ,")
   end
   print "}"
end

t = {a=1 , b=2 , c=3}
write_table(t) -->
--[[
{
a = 1 ,
c = 3 ,
b = 2 ,
}
]]
(Note the disorder :huh: .)
To edit, read the file's lines into a table (function file.lines, removes newlines) and do your string processing. Then re-concat (with newline) and rewrite into the file.

Denis

Re: How to save entire contents of a table to a text file?

Posted: Tue Oct 30, 2012 7:30 am
by Mario-Fan
spir wrote:
Mario-Fan wrote: Erm, I want the program to put numbers into the tables in the text file and then be able to load them. I want it to save the times in the song when you have to press a button, if that makes any sense. I tend not to think about programming terms since I don't discuss programming all that much because most of the people from the forum I come from that have any good experience in programming use other languages, so I don't really understand most of your post. What I do understand is that in this game, I'm not planning on having tables in tables and that I want number values in the tables, not strings.
Then, it should be far easier. If you want to edit the file content by program, then maybe do not indent the text. Something like:

Code: Select all

write_table = function (t)
   print ("{")
   for k,v in pairs(t) do
      print(k .. " = " .. v .. " ,")
   end
   print "}"
end

t = {a=1 , b=2 , c=3}
write_table(t) -->
--[[
{
a = 1 ,
c = 3 ,
b = 2 ,
}
]]
(Note the disorder :huh: .)
To edit, read the file's lines into a table (function file.lines, removes newlines) and do your string processing. Then re-concat (with newline) and rewrite into the file.

Denis
Nice! I've edited it so that it turns it into a string (and then prints it to console so that I can see how it looks instantly), but I can't work out how to get rid of the comma on the last entry (it's necessary to do that with tables, I've noticed before that the program crashes if there is a comma on the last entry). v seems to think it's always more than #t, so trying to compare them doesn't work. What next?

Code: Select all

write_table = function (t)
	local string = "{ "
	for k,v in pairs(t) do
		if v < #t then -- it never thinks this is true
			string = string .. k .. " = " .. v .. " "
		elseif v > #t then -- it always thinks this is true
			string = string .. k .. " = " .. v .. ", "
		end
	end
	string = string .. "}"
	print(string) -- When the table's {a=1, b=2, c=3}, it produces { a = 1, c = 3, b = 2, } I don't understand the order, but when a, b and c are numbers it's in the normal order
end

Re: How to save entire contents of a table to a text file?

Posted: Tue Oct 30, 2012 7:51 am
by Wojak
you can do it like this:

Code: Select all

 string = string.gsub (string,", }"," }") 
(“{ a = 1, c = 3, b = 2, }” should turn into “{ a = 1, c = 3, b = 2 }”)

Re: How to save entire contents of a table to a text file?

Posted: Tue Oct 30, 2012 8:13 am
by Mario-Fan
Wojak wrote:you can do it like this:

Code: Select all

 string = string.gsub (string,", }"," }") 
(“{ a = 1, c = 3, b = 2, }” should turn into “{ a = 1, c = 3, b = 2 }”)
Thanks! It still freezes on startup if there's a song.txt in the appdata folder though, so we're not quite done yet.
asdfhero.love
Still no gameplay :P
(2.82 MiB) Downloaded 292 times

Re: How to save entire contents of a table to a text file?

Posted: Tue Oct 30, 2012 9:56 am
by Wojak
the text file is ok, the sound file is the problem...

You are using love.filesystem.exists on a sound file, while the file will exist only inside the love file...
You are using a “static” mode for a file 3MB large (I recommend "stream" )

Re: How to save entire contents of a table to a text file?

Posted: Tue Oct 30, 2012 10:01 am
by Mario-Fan
Wojak wrote:the text file is ok, the sound file is the problem...

You are using love.filesystem.exists on a sound file, while the file will exist only inside the love file...
You are using a “static” mode for a file 3MB large (I recommend "stream" )
It's for when I implement a separate level editor. I can comment that part out for now.
I noticed on the Wiki that streaming means that it uses less memory, but I only want it to play once.

Re: How to save entire contents of a table to a text file?

Posted: Tue Oct 30, 2012 10:53 am
by Wojak
this is working on my PC:

Code: Select all

if songFile and love.filesystem.exists(love.filesystem.getSaveDirectory( ).."/"..songFile) then
	    songMusic = love.audio.newSource(songFile, "stream")
	end