在文件中查找单词
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' && 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);
【讨论】:
谢谢!这真的很有帮助以上是关于在文件中查找单词的主要内容,如果未能解决你的问题,请参考以下文章