【发布时间】:2014-11-13 23:11:44
【问题描述】:
我正在逐行读取文件,我想将其拆分为非字母字符,如果可能的话,同时删除所有非字母字符,这样我以后就不必这样做了。
我想使用isalpha,但不知道如何将它与 str.find() 或类似函数一起使用,因为这些函数通常将单个分隔符作为字符串。
while(getline(fileToOpen,str))
{
unsigned int pos= 0;
string token;
//transform(str.begin(),str.end(),str.begin(),::tolower);
while (pos = str.find_first_not_of("abcdefghijklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM"))
{
token = str.substr(0, pos);
//transform(str.begin(),str.end(),str.begin(),::tolower);
Node<t>* ptr=search(token,root);
if (ptr!=NULL)
{
ptr->count++;
cout<<token<<" already in tree.Count "<<ptr->count<<"\n";
}
else
{
insert(token,root);
cout<<token<<" added to tree.\n";
}
ptr=NULL;
str.erase(0, pos);
}
}
我最近一次失败的尝试……我能找到的所有例子都是基于str.find("single delimiter")
这对我没有好处。
找到了使用isalpha的方法
template<typename t>
void Tree<t>::readFromFile(string filename)
{
string str;
ifstream fileToOpen(filename.c_str());
if (fileToOpen.is_open())
{
while(getline(fileToOpen,str))
{
unsigned int pos= 0;
string token;
//transform(str.begin(),str.end(),str.begin(),::tolower);
while (pos = find_if(str.begin(),str.end(),aZCheck)!=str.end()!=string::npos)
{
token = str.substr(0, pos);
transform(token.begin(),token.end(),token.begin(),::tolower);
Node<t>* ptr=search(token,root);
if (ptr!=NULL)
{
ptr->count++;
// cout<<token<<" already in tree.Count "<<ptr->count<<"\n";
}
else
{
insert(token,root);
cout<<token<<" added to tree.\n";
}
ptr=NULL;
str.erase(0, pos);
}
}
fileToOpen.close();
}
else
cout<<"Unable to open file!\n";
}
template<typename t>
inline bool Tree<t>::aZCheck(char c)
{
return !isalpha(c);
}
但问题仍然存在,字符串被拆分为单个字符而不是单词,并且 isalpha 认为空格有效吗?
【问题讨论】:
-
我从未使用过它,但
find_first_not_of()是如何工作的?应该只将指针存储为拆分位置。在传递给函数的字符串中包含大写和小写字符。 -
应该返回字符串中字符的位置,该位置不是指定的字符之一,但在我的情况下,它只是分成单个字符
-
你应该检查
while( (pos=...) != npos ) -
是的,已经添加了,没有它不会拆分,它会拆分成单个字符。像这样的事情可以用 Java 中的单个 3 字语句来完成 .... C++ 并不容易
-
啊,就像我说的我从未使用过它,也做了很多 C++。但是,如果我要击败 C++ 联盟(或女士),我会首先尝试单一、简单的用例。
pos返回的断点/