在文件中查找单词

时间:2014-10-21 04:19:07

标签: c++ string vector character argv

此函数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 个答案:

答案 0 :(得分:0)

这条线并没有按照你的想法行事:

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);