fgetc() не работает, как я надеялся
Надеюсь, меня за это быстро не проголосуют, но у меня есть проект, над которым я работаю для школы, в котором я должен создать программу проверки орфографии. Я решил использовать Trie, и это, кажется, работает, но у меня есть ошибка, которую я не могу найти. Я думаю, что проблема заключается в следующем,
bool load(const char* dictionary)
{
if (!rootNode)
{
rootNode = trieNodeCreate();
if (!rootNode)
{
printf("could not allocate root node");
return false;
}
}
// Open the file
FILE* fp = fopen(dictionary, "r");
if (fp == NULL)
{
printf("could not open dictioanry %s\n", dictionary);
return false;
}
int index = 0;
for (int c = fgetc(fp); c != EOF; c = fgetc(fp))
{
char word[LENGTH];
if (c != '\n' )
{
word[index] = c;
index++;
}
else
{
trieWordInsert(word, rootNode);
index = 0;
wordCount ++;
}
}
fclose(fp);
if (wordCount)
{
return true;
}
return false;
}
но я не смог его найти. Остальную часть проекта можно найти на
2 ответа
Я думаю, что вы не заканчивали слово "\0"
char word[LENGTH];
if (c != '\n' )
{
word[index] = c;
index++;
}
else
{
word[index] = '\0'; //missing this one!!!
trieWordInsert(word, rootNode);
index = 0;
wordCount ++;
}
Я думаю тебе лучше использовать fscanf
и прочитайте файл слово за словом.
Объявите свой word[LENGTH]
массив вне цикла, иначе он просто отбросит word
указатель и освободить выделенное в конце каждого цикла, создать новый. Я не думаю, что вы хотите этого, я думаю, что вы хотели бы этого только тогда, когда if
условие не выполняется.
Может я не знаю что trieWordInsert
делает, но я буду считать, что вам понадобится 0
терминатор.
- декларировать
word[LENGTH] = { 0 };
прямо передfor( ... ) { ... }
- Добавить
memset( word, 0, LENGTH);
внутриelse
заблокировать там - Включают
memory.h
или жеstring.h
дляmemset
если вы еще не включили ни одного из них
И это должно быть, я думаю...
Изменить: после того, как узнал, как trieWordInsert
более или менее выдает word
толкнул в...
ПРЯМОЙ КОД ДЛЯ EZ MODE:
bool load( const char* dictionary )
{
if ( !rootNode )
{
rootNode = trieNodeCreate( );
if ( !rootNode )
{
printf( "could not allocate root node" );
return false;
}
}
// Open the file
FILE* fp = fopen( dictionary, "r" );
if ( fp == NULL )
{
printf( "could not open dictioanry %s\n", dictionary );
return false;
}
int index = 0;
char word[LENGTH];
for ( int c = fgetc( fp ); c != EOF; c = fgetc( fp ) )
{
if ( c != '\n' )
{
word[index] = c;
index++;
}
else
{
word[index] = 0;
trieWordInsert( word, rootNode );
index = 0;
wordCount++;
}
}
fclose( fp );
if ( wordCount )
{
return true;
}
return false;
}