Load 'tree' from file
BlitzMax Forums/BlitzMax Programming/Load 'tree' from file
| ||
My program outputs a list of items like the following. It saves the 'indent level' and then the name of the item.0 Item 0 Item 1 SubItem 2 SubSubItem 1 SubItem 1 SubItem 0 Item 1 SubItem 2 SubSubItem 3 SubSubSubItem How would I go about loading that back into a linked list? |
| ||
| Hi, I would probably create 2 Types for this: First type is an 'interface' type which holds all the functionality like 'CreateNode' or 'AddNode' or 'SaveToFile' or 'LoadFromFile' or 'ShowAllÍtems' etc. and it would also contain a TList which holds the actual data hence forth known as 'nodes'. Second type is a 'data' type or 'Node' which holds information of that item like 'name' or 'color' etc. and it has 2 basic components: 'Parent node' and 'child node'. If there is no parent then you would know that it's the first in line and if there is no child then you 'd know that it's the last in line. When you iterate list do something like: For Local node:TNode = EachIn list If Not node.parent 'First node Print node.name Else Print "~t" + node.name EndIf Next Anyway this is just a basic idea, implemention depends on the need / purpose. -Henri |
| ||
| Thanks for the reply. I'm having a hard time figuring this out. It's probably much simpler than I'm making it. I forgot to say in my first post that the output is to a file. It writes an integer for the indent level, and then the name of the item. It's easy to read them all back if you don't need to worry about subitems. |
| ||
| This smells like a job for XML! :) http://www.blitzbasic.com/Community/posts.php?topic=68699 Dabz |
| ||
Ok, lets assume that text file is in a format descriped in 1# post then something like this could suffice:Strict
Local file:TStream = OpenStream("my_file.txt")
If Not file Then Notify("file not found!"); End
Local list:TList = New TList, item:TItem
While Not Eof(file)
Local s:String = ReadLine(file)
If Not s Then Continue
Local data:String[] = s.split("~t")
If Not data Then Continue
item = New TItem
item.indent = Int(data[0])
item.name = data[data.length - 1]
list.addlast(item)
Wend
CloseStream(file)
'Iterate our list. Just for fun we add tabs also.
Local tabs:String
For item = EachIn list
For Local i:Int = 0 To item.indent
tabs:+ "~t"
Next
Print item.indent + tabs + item.name
tabs = ""
Next
End
Type TItem
Field indent:Int
Field name:String
EndType-Henri |
| ||
| Ive made a database for that. It works fine for my needs https://www.dropbox.com/s/3d7rnr14xyugy7y/MyDataBaseV2.bmx?dl=0 |
| ||
| This is similar to something I'm working on, code folding. It uses levels to determine if a fold is in another fold. To reload the data: - if it's just 2 things you're associating use a map key+value, if you need to access chronologically you can also store the keys in a list as MapKey loops are ordered like 1,11,2,12 instead of 1,2. - for more than 2 add the data to a space separated string and then parse that in a function or use a custom type and store the objects in a list. |
| ||
| This smells like a job for XML I'm tending toward JSON these days, since it's what I appear to work with all the time... (for example Vert.x uses it for its interprocess communication). |
| ||
| I've started using XML with Brucey's libxml module. Thanks for it, Brucey! I like it better than the method I was using before. I think it has advantages that make it more suitable for me. However, I'm still struggling with getting the XML nodes loaded into a linked list. I can't find an example of it anywhere, either. Does anyone have an example of such a thing? |