Использовать токенайзер в C ++ из файла?

Я работаю над заданием, которое требует, чтобы я прочитал несколько строк текста из файла, и в конце использую qsort, чтобы отсортировать слова в алфавитном порядке и отобразить счетчик того, сколько раз использовалось каждое слово. Я понял, что собираюсь токенизировать строки, когда они считываются из файла. Единственная проблема заключается в том, что отдельные токены как бы исчезают после того, как вы это сделаете, поэтому я должен добавить их в список. Я плохо объясняю, вот мой код:

#include<iostream>
#include<string>
#include<algorithm>
#include<stdlib.h>
#include<fstream>
using namespace std;

int compare(const void* , const void*);
const int SIZE = 1000;
const int WORD_SIZE = 256;
void main()
{
cout << "This program is designed to alphabetize words entered from a file." <<     endl;
cout << "It will then display this list with the number of times " << endl;
cout << "that each word was entered." << endl;
cout << endl;
char *words[SIZE];//[WORD_SIZE];
char temp[100];
char *tokenPtr, *nullPtr= NULL;
char *list[SIZE];
string word;
int i = 0, b = 0;
ifstream from_file;
from_file.open("prob1.txt.txt");
if (!from_file)
{
cout << "Cannot open file - prob1.txt";
exit(1);  //exits program
}

while (!from_file.eof())
{
from_file.getline(temp, 99);
tokenPtr = strtok(temp, " ");
while (tokenPtr != NULL)
{
cout << tokenPtr << '\n';
list[b] = tokenPtr;
b++;
tokenPtr = strtok(nullPtr, " ");
}
word = temp;
transform(word.begin(), word.end(), word.begin(), ::tolower);
words[i] = list[i];
i++;
}
from_file.close();
qsort(words, i, WORD_SIZE, compare);
int currentcount = 1 ;
int k;
for( int s = 0; s < i; s++ )
{
for( k = 1; k <= s; k++)
{
if( words[s] == words[k] )
{
currentcount++;
}
currentcount = 1;
words[k] = "";
}
cout << words[s] << " is listed: " << currentcount << " times." << endl;
words[s] = "";

}
}
int compare(const void* p1, const void *p2)
{
char char1, char2;

char1 = *(char *)p1;  // cast from pointer to void
char2 = *(char *)p2;  // to pointer to int

if(char1 < char2)
return -1;
else
if (char1 == char2)
return 0;
else
return 1;
}

Не хватает только функции сравнения, но программа работает нормально, вплоть до qsort, в котором происходит сбой, но она не говорит мне, почему. Кто-нибудь может пролить некоторое понимание / помочь мне исправить это?

Опять же, это задание. (Мне сказали, что мне нужно это указать?)

1

Решение

Массив words это массив указателей на char:

char*   words[SIZE];   // SIZE elements of type `char*`

Итак, третий параметр WIDTH должна быть ширина указателя на символ.

qsort(words, i, sizeof(char*), compare);

Также ваша реализация сравнения не работает, как вы ожидаете.
Вы передаете указатели на сравнение. Но они являются указателями на элементы. Вам нужно отменить ссылку на указатели, чтобы получить значения:

int compare(const void* p1, const void *p2)
{
char const*  x = *(char**)p1;
char const*  y = *(char**)p2;

Это не сравнивает строки:

if( words[s] == words[k] )

Это просто сравнивает два указателя. Чтобы сравнить строки, на которые они указывают, используйте strcmp ()

if( strcmp(words[s], words[k]) == 0)

Это должно остановить сбои, но мы можем сделать гораздо больше улучшений в этом коде:
Как только вы это заработаете, вы должны опубликовать это здесь https://codereview.stackexchange.com/ для обзора.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]