Что не так со следующим кодом записи файла? - PullRequest
0 голосов
/ 25 февраля 2012

У меня есть следующая структура, которую я использую для создания хеш-таблицы для отпечатков пальцев

typedef struct fpinfo
{ 
   unsigned long chunk_offset;
   unsigned long chunk_length;
   unsigned char fing_print[33];
}fpinfo;

/ * * Следующее определяет одну запись в хеш-таблице.* /

typedef struct Hash_Entry 
{
   struct Hash_Entry *next; /* Link entries within same bucket. */
   unsigned namehash;   /* hash value of key */
   struct fpinfo fp;
} Hash_Entry;

typedef struct Hash_Table 
{
   struct Hash_Entry **bucketPtr;   /* Buckets in the table */
   int numBuckets;
   int        buck_entry_count[64];//number of entries in each bucket
   int      size;       /* Actual size of array. */
   int      numEntries; /* Number of entries in the table. */
   int      mask;       /* Used to select bits for hashing. */
} Hash_Table;

Я вставляю в него отпечатки пальцев, используя

int Hash_CreateEntry(Hash_Table *t, struct Hash_Entry he)
{
Hash_Entry *e;
const char *p;
int keylen;
struct Hash_Entry **hp;
unsigned long h = 0, g,i=0;

while ( i<5 ) 
 {
    h = ( h ) + he.fp.fing_print[i]++;
     g = h & 0xF0000000;
    h ^= g >> 24;
    h &= ~g;
    i++;
}

p =(const char*) he.fp.fing_print;
for (e = t->bucketPtr[h & t->mask]; e != NULL; e = e->next)
{
    if (e->namehash == h && strcmp((const char *)(e->fp).fing_print, p) == 0)
    {
        printf("\n%d \t%s",(e->fp).chunk_length,(e->fp).fing_print);
        return (1);
    }
}

if (t->numEntries >= rebuildLimit * t->size)
    WriteHTtoFile(t);
e = (Hash_Entry *)malloc(sizeof(*e) /*+ keylen*/);
hp = &t->bucketPtr[h & t->mask];
e->next = *hp;
*hp = e;
e->namehash = h;
strcpy((char *)(e->fp).fing_print, p);
t->numEntries++;
t->buck_entry_count[h & t->mask]++;
return (0);
}

Код, который я использовал для записи HT в файл:

static void   WriteHTtoFile(Hash_Table *t)
{
Hash_Entry *e, *next = NULL, **hp, **xp;
int i=0, mask;
    Hash_Entry **oldhp;
int oldsize;
FILE *htfile=fopen("htfile.txt","a");
system("cls");

for ( hp = t->bucketPtr;t->bucketPtr!=NULL;hp=t->bucketPtr++)
    {
    for (e = *hp;e ->next!= NULL;e = e->next) 
    fprintf(htfile,"\n%d \t%s",(e->fp).chunk_length,(e->fp).fing_print);        
    }
fclose(htfile);
}

Моя проблема в том, (are)

1 - там написано "Место чтения нарушения доступа 0xfdfdfe09."после написания значительное количество раз (он написал 6401 отпечатков пальцев).Указывает, что ошибочная строка будет fprintf () в функции записи файла.

2- отпечатки пальцев, которые он пишет, и то, что у меня есть до записи, не совпадает вообще.На самом деле шестнадцатеричное представление отпечатков в компиляторе (я использую VC2010) и то, которое у меня есть, которое читается программой, отличаются.

3 - значения chunck_length для всех записей 3452816845l

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Я думаю, цикл в WriteHTtoFile должен выглядеть примерно так:

for (i = 0; i < t->numBuckets; ++i)
{
    for (e = t->bucketPtr[i]; e && e->next; e = e->next) 
        fprintf(htfile, /*...*/);        
}
0 голосов
/ 25 февраля 2012

У вас больше проблем, чем это; этот код безнадежно испорчен

  • WriteHTToFile изменяет исходную хеш-таблицу, так что вы получите утечку памяти как минимум
  • Вы используете %d формат для распечатки fing_print; не совсем понятно, что fing_print является / должно быть (двоичная строка; строка ascii).

Получите хорошую книгу по Си и попрактикуйтесь с отладчиком.

...