Поиск слов в файле

Это функция 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);
Другие вопросы по тегам