Thread: Serializing/deserializing problem

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Registered User
    Join Date
    Oct 2007
    Posts
    6

    Serializing/deserializing problem

    Hi, I'm using a trie for fast storing/retrieval of strings and associated value, and the trie API includes functions for de/serializing the trie. So I need to implement a save() and load() methods, that will call serialize() and deserialize() in trie.c. I'm having problems to get this working, it compiles fine, and I can serialize data to disk, but I can't deserialize data to create a trie from the file. I don't know wheter the problem is in how I write trie's data to
    disk, or when I load it from disk, or both.

    I copy below the code of a test program that uses the trie API, and I add links to the trie header and definitions. The program reads a file with strings (one per line) and stores them in the trie, storing a value with each string. The serialize function in trie.c will call _write_to_handle() for each key in the trie, and _write_value_to_handle() for each value associated with a key.

    Code:
    /* Usage:
    #test -save /tmp/words.txt      read strings, store in trie, and save trie to disk.
    #test -load                             load data from disk and builds a trie from it.
    */
    
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    #include "trie.h"
    
    #define LINESZ 1024
    
    static int total_words = 0;
    int total_values=0;
    
    const void *value;
    Trie trie;
    
    /* Methods called when serialing trie data */
    static int _write_handle(const void *towrite, const int length, void *handle)
    {
        fwrite(&towrite, length, 1, (FILE *) handle);  
        return 1;	
    }
    
    static int _write_value_handle(const void *towrite, void *handle)
    {
        fwrite(&towrite, sizeof(int), 1, handle);  
        return 1;
    }
    
    /* Methods called when deserialing trie data */
    static int _read_handle(void *wasread, const int length, void *handle)
    {   
         printf("_read_handle called. length: &#37;d\n",length);
         fread(wasread, length, 1, (FILE *) handle);   
         printf("wasread is: %s\n",wasread);   
         return 1;	
    }
    
    static void * _read_value_handle(void *handle)   //returns a pointer to the value
    {
    //In my tests, this method never gets called, because a problem happens with
    // the data read in _read_handle(). No error given, deserialize() function just quits.
        int *value;
        printf("_read_value_handle called.");
        fread(&value, sizeof(int), 1, handle);  
        printf("value read is: %d",value);
        return value;
    }
    
    /* Methods to serialize and deserialize the trie  */
    int trie_save(){   
      FILE *out = fopen("savefile.txt", "wb"); 
      int success=Trie_serialize(trie, _write_handle, _write_value_handle, (void *)out); 
      fclose(out);		   
      return success;
    }
    
    int trie_load(){ 
       int success=1;
       FILE *in = fopen("savefile.txt", "rb"); 
       trie = Trie_deserialize(_read_handle, _read_value_handle,in);
       if(!trie) {
          success=0;
          printf("Error: trie could not be created from data.\n");
      }
      fclose(in);		   
      return success;
    }
    
    int main(int argc, char **argv) {
      char s[LINESZ];
      int myval;
      
      if(!strcmp(argv[1], "-load")) { 
             int success=trie_load();
      	 printf("load sucess is: %d\n",success);
      }
    
      if(!strcmp(argv[1], "-save")) {
      
    FILE *in = fopen(argv[2], "r"); // e.g. /tmp/words.txt trie=Trie_new(); value=(const void *)1; if (!in) { perror(argv[1]); return 1; } while (fgets(s, LINESZ, in)) { int len = strlen(s); if (len) { s[len-1] = '\0'; // chop newline total_words++; // add to trie //arg3 is the value Trie_set(trie, (const unsigned char*) s, (const void*) total_words); } } fclose(in); int success=trie_save(); printf("serialized trie success: %d\n",success);
    } fprintf(stderr, "Checked %d total words.\n", total_words); fprintf(stderr, "Trie length is: %d .\n", Trie_len(trie)); Trie_del(trie); return 0; }
    trie.h, trie.c


    I'd much appreciate any suggestions about what I'm doing wrong.

    Thanks.
    Last edited by vsla; 04-21-2008 at 02:59 PM.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Need help understanding a problem
    By dnguyen1022 in forum C++ Programming
    Replies: 2
    Last Post: 04-29-2009, 04:21 PM
  2. Memory problem with Borland C 3.1
    By AZ1699 in forum C Programming
    Replies: 16
    Last Post: 11-16-2007, 11:22 AM
  3. Someone having same problem with Code Block?
    By ofayto in forum C++ Programming
    Replies: 1
    Last Post: 07-12-2007, 08:38 AM
  4. A question related to strcmp
    By meili100 in forum C++ Programming
    Replies: 6
    Last Post: 07-07-2007, 02:51 PM
  5. WS_POPUP, continuation of old problem
    By blurrymadness in forum Windows Programming
    Replies: 1
    Last Post: 04-20-2007, 06:54 PM