У меня есть программа, которая читает в гигантском текстовом файле строк в этом формате, и мне нужно построить структуру данных из этого текстового файла.Реконструкция индекса в C
microfinance 5 41 5 1650 2 1667 1 1811 1 1988 5
subminiature 1 432 1
Номер 1-го числа после слова - это количество документов, в которых находится слово. Следующие номера чередуются между идентификационным номером документа и количеством вхождений слова, найденного в документе. Таким образом, для микрофинансирования существует 5 документов, первый из которых - документ 41 с 5 вхождениями, следующий - документ 1650 с 2 и т. Д.
Я использую strtok для получения каждого элемента и организации их. Я знаю, что strtok работает нормально. Проблема заключается в правильном подключении элементов к моим структурам данных.
DocumentNode *myDoc;
while (fgets(theLine, sizeof(theLine), newPointer) != NULL)
{
counter = 0;
pch = strtok (theLine," ");
while (pch != NULL)
{
if (0 == counter)
{
WordNode *toInsertPtr = (malloc(sizeof(struct WordNode)));
word = (malloc(100));
strncpy (word, pch, strlen(pch));
toInsertPtr->word = word;
toInsertPtr->next = NULL;
currIndex = JenkinsHash(word, MAX_HASH_SLOT);
if ((TheIndex->index[currIndex]) == NULL)
{
TheIndex->index[currIndex] = toInsertPtr;
}
else
{
TheIndex->index[currIndex]->next = toInsertPtr;
}
}
if (1 == counter)
{
numOfDocs = atoi(pch);
}
if (counter % 2 == 0 && counter != 0 && pch != NULL)
{
myDoc= (malloc(sizeof(struct DocumentNode)));
myDoc->next = NULL;
int doc_id = atoi(pch);
myDoc->documentID = doc_id;
}
if (counter % 2 != 0 && counter != 1 && pch != NULL)
{
myDoc->occurences = atoi(pch);
if (TheIndex->index[currIndex]->page == NULL)
{
TheIndex->index[currIndex]->page = myDoc;
}
else
{
TheIndex->index[currIndex]->page->next = myDoc;
}
}
pch = strtok (NULL, " ");
counter++;
}
}
У меня есть GDBed, чтобы выяснить, что проблема здесь. Первый оператор if, проверяющий, есть ли узел индекса в индексе, всегда улавливается как нуль (даже если в этой точке индекса явно есть что-то), и он перезаписывает один слот снова и снова. Почему он всегда считает, что это NULL, когда это не так?
if (TheIndex->index[currIndex]->page == NULL)
{
TheIndex->index[currIndex]->page = myDoc;
}
else
{
TheIndex->index[currIndex]->page->next = myDoc;
}
Структуры данных заключаются в следующем:
typedef struct DocumentNode {
struct DocumentNode *next; // pointer to next member of the list.
int documentID; //doc identifier (filename, ie. 1, 2, etc.)
int occurences; //num. occurances.
} DocumentNode;
typedef struct WordNode {
struct WordNode *next; //pointer to the next word (for collisions)
char *word; //the word itself.
DocumentNode *page; // pointer to the first element of the page list.
} WordNode;
typedef struct InvertedIndex {
WordNode *index[MAX_HASH_SLOT];
} InvertedIndex;
Я думаю, что ваш вызов 'strncpy' неверен. Размер должен включать завершающий \ 0. Предложите использовать вместо этого функцию 'strdup', это комбинированные' malloc' и 'strcpy'. –