我正在尝试为类编写一个数据库,其中我从文件中读取了所有键值(格式化的keyNULL BYTEvalueNULL 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 );
答案 0 :(得分:5)
定义应该像
typedef struct Key{
char *name;
struct Key *next; // <-- Note `struct` here
}Key;
你不能只使用Key
[没有在结构定义中明确地编写struct],因为结构尚未定义[typedefed]
答案 1 :(得分:1)
虽然我正在挖掘我的编译器,但您可以尝试将声明更改为:
typedef struct Key_ {
char *name;
struct Key_ *next;
} Key;
如果有帮助,请告诉我们?我想你可能在声明之前使用了typedef。