Поиск слов в файле
Это функция buildTree, которая читает текстовый ввод (содержится в файле с именем в argv[1]). Затем я открываю файл, читая символ за символом, если есть новая строка ("if (token == '\n')"), отслеживаю этот номер строки и сохраняю его в векторе, чтобы получить к нему доступ позже. Затем он разбивает его на последовательность слов (используя любой символ, кроме цифры или алфавитного символа в качестве терминатора). Здесь я получаю ошибку. Затем я пытаюсь добавить каждый символ в строку, а затем, когда токен представляет собой цифру или алфавитный символ, затем вставить строку в вектор, чтобы я мог получить к нему доступ позже. Правильна ли моя логика? А также вы можете помочь с моей ошибкой при вставке каждого слова в вектор.
Извините если путаю
BinarySearchTree buildTree (char *argv[]){
ifstream file;
vector<char *> V;
int line = 0;
vector<int> LineNumber;
file.open(argv[1],ios::in);
char token;
string word[] = {};
if (file.is_open()){
token = file.get();//reads the next character from a stream
if (token == '\n')
line++;
LineNumber.push_back(line);
while (token!= ' ' || '0' || '1' || '2' || '3' || '4' || '5' ||'6' || '7' || '8' || '9'){
//while character is not space, digit, or non-alphabetic character
word += token;//adds character to string array *error here
}
V.push_back(word);//adds word to vector *error here
}
}
1 ответ
Эта строка не делает то, что вы думаете:
while (token!= ' ' || '0' || '1' || '2' || '3' || '4' || '5' ||'6' || '7' || '8' || '9')
Вы должны сравнить это индивидуально, token != '0' && token != '1' ...
, Однако вы всегда можете воспользоваться стандартной библиотекой C (для этого она и нужна).
#include <cctype>
while (!std::isspace(token) && !std::isdigit(token))
Кроме того, вам здесь не нужен цикл while. Измените это на if
,
Во-вторых, вы пытаетесь объединить char
к string[]
, Вы, вероятно, хотели объявить string
вместо.
std::string word = "";
Наконец, ваш vector
объявляется с типом value_type char*
, но вы пытаетесь push_back строку. Измените это на:
std::vector<std::string> V;
Вышеуказанное исправляет немедленные ошибки в вашем коде, но, вероятно, не решает основную проблему. Насколько я понимаю, вы пытаетесь найти только строки, состоящие из буквенных символов (без цифр, пробелов или знаков пунктуации). Ваше состояние просто становится if (std::isalpha(token))
потому что это исключает остальные три.
Во-вторых, в вашем коде нет цикла. Вы читаете только один символ. Ты можешь использовать while (std::getline(file, input))
читать ваш файл построчно. Из-за природы потоков цикл завершается, когда из потока больше нечего читать. Следовательно, ваш код становится:
if (file.is_open()){
std::string input;
while (std::getline(file, input))
{
for (std::size_t i = 0; i < input.size(); ++i)
{
token = input[i];
if (token == '\n')
{
line++;
}
LineNumber.push_back(line);
if (std::isalpha(token))
{
word += token;
}
}
V.push_back(word);
word = "";
}
}
Обратите внимание word = ""
, Вам нужно очистить его перед построением следующего слова.
Кроме того, вы можете проверить, является ли слово пустым, прежде чем вставлять его в вектор (чтобы избежать пустых записей в вашем векторе):
if (word.size()) V.push_back(word);