代码之家  ›  专栏  ›  技术社区  ›  David Watson

C中的链接列表,无成员错误

  •  2
  • David Watson  · 技术社区  · 14 年前

    我正试图为类编写一个数据库,在该类中,我从一个文件(格式化的keynull bytevalenull byte等)中读取所有键值。我打算为此使用一个链接列表,但我得到的错误是结构没有下一个值。请帮帮我!

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <string.h>
    #include <stdbool.h>
    
    #include "sdbm.h"
    
    static FILE *db;
    static bool opened = false;
    static int err = 0, keyLen = 8;
    
    typedef struct {
      char *name;
      Key *next;
    } Key;
    
    static Key *head = NULL,*tail = NULL; 
    /**
     * Create new database with given name. You still have
     * to sdbm_open() the database to access it. Return true
     * on success, false on failure.
     */
    bool sdbm_create( const char *name ) { //Errors: 1) fopen failed 2) fclose failed on new db
      db = fopen(name, "w");
      if (db == NULL) {
        printf("Couldn't create file %s\n",name);
        err = 1;
        return false;
      }
      if (fclose(db) == EOF) {
        printf("Couldn't close created file %s\n",name);
        err = 2;
        return false;
      }
      return true;
    }
    /**
     * Open existing database with given name. Return true on
     * success, false on failure.
     */
    bool sdbm_open( const char *name ) { //Errors: 3) couldn't open database
      db = fopen(name,"r+");
      if (db == NULL) {
        err = 3;
        printf("Couldn't open database file %s\n",name);
        return false;
      }
      opened = true;
      int c;
      bool inKey = true;
      int currKey[MAX_KEY_LENGTH];
      while ((c = getc(db)) != EOF)  {
        if (!inKey && c == '\0') {
          inKey = true;
        }
        else if (inKey && c == '\0') {
          if (tail != NULL) {
            tail->next = malloc(sizeof(Key));
            tail = tail->next;
          }
          else {
            tail = malloc(sizeof(Key));
            head = tail;
          }
          tail->next = NULL;
          tail->name = currKey;
    
        }
        else if (inKey) { 
          currKey[keyLen] = c;
          keyLen++;
        }
      }
    }
    /**
     * Synchronize all changes in database (if any) to disk.
     * Useful if implementation caches intermediate results
     * in memory instead of writing them to disk directly.
     * Return true on success, false on failure.
     */
    //bool sdbm_sync();
    
    /**
     * Close database, synchronizing changes (if any). Return
     * true on success, false on failure.
     */
    bool sdbm_close() { // Errors: 5) Couldn't close database
      if (fclose(db) == EOF) {
        err = 5;
        printf("Couldn't close database.\n");
        return false;
      }
      return true;
    }
    /**
     * Return error code for last failed database operation.
     */
    int sdbm_error() {
      return err;
    }
    
    /**
     * Is given key in database?
     */
    //bool sdbm_has( const char *key );
    
    /**
     * Get value associated with given key in database.
     * Return true on success, false on failure.
     *
     * Precondition: sdbm_has(key)
     */
    //bool sdbm_get( const char *key, char *value );
    
    /**
     * Update value associated with given key in database
     * to given value. Return true on success, false on
     * failure.
     *
     * Precondition: sdbm_has(key)
     */
    //bool sdbm_put( const char *key, const char *value );
    
    /**
     * Insert given key and value into database as a new
     * association. Return true on success, false on
     * failure.
     *
     * Precondition: !sdbm_has(key)
     */
    //bool sdbm_insert( const char *key, const char *value );
    
    /**
     * Remove given key and associated value from database.
     * Return true on success, false on failure.
     *
     * Precondition: sdbm_has(key)
     */
    //bool sdbm_remove( const char *key );
    
    2 回复  |  直到 14 年前
        1
  •  5
  •   Prasoon Saurav    14 年前

    typedef struct Key{
      char *name;
      struct Key *next; // <-- Note `struct` here
    }Key;
    

    Key

        2
  •  1
  •   jwismar    14 年前

    typedef struct Key_ {
      char *name;
      struct Key_ *next;
    } Key;