此函数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
}
}
答案 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);