在文件中查找单词

Posted

技术标签:

【中文标题】在文件中查找单词【英文标题】:Finding words in a file 【发布时间】:2014-10-21 04:19:06 【问题描述】:

该函数 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
    

【问题讨论】:

while 条件检查不会按照您的想法进行。 【参考方案1】:

这条线并没有像你想象的那样做:

while (token!= ' ' || '0' || '1' || '2' || '3' || '4' || '5' ||'6' || '7' || '8' || '9')

您必须单独比较它,token != '0' &amp;&amp; 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);

【讨论】:

谢谢!这真的很有帮助

以上是关于在文件中查找单词的主要内容,如果未能解决你的问题,请参考以下文章

在文件中查找单词

如何使用 grep 在文件夹中查找单词?

在文本文件中查找特定单词并计算它

如何使用熊猫在特定列中的csv文件中查找特定单词

在文本文件中查找单词

在文件中查找特定单词并删除其行[关闭]