help with reading a text file and storing the values into a tree

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • slizorn
    New Member
    • Jul 2008
    • 34

    help with reading a text file and storing the values into a tree

    Hi guys,
    I have this coding that I wanted to try out.
    Basically this is meant to be done in Java as practice for the Topic trees in data structures and algorithms.
    I have recently learned C++ on my own so I wanted to test my skill in C++ by tryin to solve this problem using C++.

    so yea here it goes...
    i have a text file as follows...
    Code:
    H,E,L
    E,B,F
    B,A,C
    A,null,null
    c,null,D
    D,null,null
    F,null,G
    G,null,null
    L,J,M
    J,I,K
    I,null,null
    K,null,null
    M,null,null
    i want to write the code that would read in the text file and store the 1st value gotten as a root, the 2nd value as the left value of the root and 3rd value as the right value of the root..
    i have already given a shot at this but i aint that successful with it..

    the following are the 2 other files... Tree.h and TreeNode.h
    this one is TreeNode.h
    Code:
    #pragma once
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <deque>
    #include <queue>
    using namespace std;
    
    template <class T>
    class TreeNode
    {
    	public:
    		TreeNode<T>(T newItem);
    		~TreeNode<T>(void);
    		void setItem(T newItem);
    		void setLeft(TreeNode newLeft);
    		void setRight(TreeNode newRight);
    		T getItem();
    		T getLeft();
    		T getRight();
    
    	private:
    		T item;
    		TreeNode left;
    		TreeNode right;
    };
    
    
    template <class T>
    TreeNode<T>::TreeNode(T newItem)
    {
    	item = newItem;
    	left = null;
    	right = null;
    }
    
    template <class T>
    TreeNode<T>::~TreeNode(void)
    {
    }
    
    
    template <class T>
    void TreeNode<T>::setItem(T newItem) 
    {
    	// set methods
    	item = newItem;
    }
    
    template <class T>
    void TreeNode<T>::setLeft(TreeNode newLeft) 
    {
    	left = newLeft;
    }
    
    template <class T>
    void TreeNode<T>::setRight(TreeNode newRight) 
    {
    	right = newRight;
    }
    
    template <class T>
    T TreeNode<T>::getItem() 
    {
    	// get methods
    	return item;
    }
    
    template <class T>
    T TreeNode<T>::getLeft() 
    {
    	return left;
    }
    
    template <class T>
    T TreeNode<T>::getRight() 
    {
    	return right;
    }
    this one is Tree.h
    Code:
    #pragma once
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <deque>
    #include <queue>
    using namespace std;
    
    template <class T>
    class Tree
    {
    	public:
    		Tree<T>(T rootItem);
    		~Tree<T>(void);
    		bool isEmpty();
    		T getRoot();
    		
    	private:
    		TreeNode root;
    };
    
    
    template <class T>
    Tree<T>::Tree(T rootItem)
    {
    	root = new TreeNode(rootItem);
    }
    
    template <class T>
    Tree<T>::~Tree(void)
    {
    }
    
    
    template <class T>
    bool Tree<T>::isEmpty() 
    {
    	// check emtpy
    	return root == null;
    }
    
    template <class T>
    T Tree<T>::getRoot() 
    {
    	// get tree root
    	return root;
    }

    the following code is from my main method to try and read the file... but it isnt correct..
    Code:
    typedef queue<TreeNode> TreeLinkedList;
    TreeLinkedList myQueue;
    
    template <class T>
    T readOneObject(string string1)
    {
    	char * cstr, *p;
    	int counter;
    	string str (string1);
    	string data1, data2, data3;
    
    	cstr = new char [str.size()+1];
    	strcpy (cstr, str.c_str());
    
    	// cstr now contains a c-string copy of str
    
    	int count = 0;
    	p=strtok (cstr,",");
    	count++;
    	while (p!=NULL)
    	{
    		p=strtok(NULL,",");
    		if( count == 1 )
    		{
    			data1.append(p);
    			root = data1;
    		}
    		else if( count == 2 )
    		{
    			data2.append(p);
    		}
    		else if( count == 3 )
    		{
    			data3.append(p);
    		}
    		count++;
    		if( count == 3 )
    			break;
    	}
    
    	delete[] cstr; 
    	return treeObj;
    }
    
    void readFile(string filename1)
    {
    	char oneline[256];
    	ifstream infile(filename1.c_str());
    	Tree * treeObj = NULL;
    
    	while(infile.good())
    	{
    		infile.getline(oneline, 256);
    
    		if(strlen(oneline) == 0)
    		{
    			continue;
    		}
    		treeObj = readOneObject(oneline);
    
    		//if( treeObj != NULL )
    			//myQueue.push(treeObj); //linkedListObj.InsertNode(shapeObj);
    	}
    	infile.close();	
    }
    every help is appreciated.. please help me to solve this...
    thanks in advance...:D
    i will check for replies every 30 mins or lesser.. so plz come back and check if u had left any comments or qns for me to answer.. thanks :D
  • arnaudk
    Contributor
    • Sep 2007
    • 425

    #2
    I didn't read your code, but can you be more specific about what problems you are having?

    Comment

    • JosAH
      Recognized Expert MVP
      • Mar 2007
      • 11453

      #3
      You 'left' and 'right' items in your TreeNode class should be pointers (or references)
      to a TreeNode; your Java background is shining through ;-) You're also missing
      some <T> template tags here and there ...

      kind regards,

      Jos

      Comment

      • slizorn
        New Member
        • Jul 2008
        • 34

        #4
        Originally posted by arnaudk
        I didn't read your code, but can you be more specific about what problems you are having?
        well basically i want to create a method for reading in my text file and saving it to the respective right, left, root of the tree node

        problems faced are that my method is wrong so it aint working.. it/the method for readin in a file isnt correct...

        Comment

        • slizorn
          New Member
          • Jul 2008
          • 34

          #5
          Originally posted by JosAH
          You 'left' and 'right' items in your TreeNode class should be pointers (or references)
          to a TreeNode; your Java background is shining through ;-) You're also missing
          some <T> template tags here and there ...

          kind regards,

          Jos

          haha yea i did do a full course in Java in my 1st yr in uni.. goin to enter 2nd yr this sept.. was hopin to get some practice for a small headstart.. ;)
          well gimme a few mins i will edit my code again and post it..
          could ya tell me how i shd go abt implementing/writing the code to read in my text file? its definitely wrong but sort of in the right track..

          Comment

          • slizorn
            New Member
            • Jul 2008
            • 34

            #6
            Originally posted by JosAH
            You 'left' and 'right' items in your TreeNode class should be pointers (or references)
            to a TreeNode; your Java background is shining through ;-) You're also missing
            some <T> template tags here and there ...

            kind regards,

            Jos
            by the way
            u see anything wrong with the 1st line?
            typedef queue<TreeNode> TreeLinkedList;
            TreeLinkedList myQueue;

            error C3203: 'TreeNode' : unspecialized class template can't be used as a template argument for template parameter '_Ty', expected a real type

            Comment

            • JosAH
              Recognized Expert MVP
              • Mar 2007
              • 11453

              #7
              Originally posted by slizorn
              by the way
              u see anything wrong with the 1st line?
              typedef queue<TreeNode> TreeLinkedList;
              TreeLinkedList myQueue;

              error C3203: 'TreeNode' : unspecialized class template can't be used as a template argument for template parameter '_Ty', expected a real type
              Is the type TreeNode known at that location? You do have to #include it before
              you want to use it; C++ is definitely not Java.

              kind regards,

              Jos

              Comment

              • Laharl
                Recognized Expert Contributor
                • Sep 2007
                • 849

                #8
                You've also declared TreeNode as a template class, thus, your declaration should be
                Code:
                typedef queue<TreeNode<some type)> > TreeLinkedList;
                . The space is necessary, otherwise C++ interprets it as the >> operator and you'll get errors.

                Comment

                • weaknessforcats
                  Recognized Expert Expert
                  • Mar 2007
                  • 9214

                  #9
                  I assume this is for a course you are taking otherwise you should be using a map.

                  Comment

                  Working...