我的输入文件是这样的:
C:\Users\DeadCoder\AppData\Local\CoCreate
我正在创建一个树,我需要在使用\
分隔符从输入文件中读取时抽象目录的名称。就像上面的例子一样,我需要单独抽象c:,用户,DeadCoder,Appdata ....我希望每个人都能理解这些问题。
现在让我们看看我们得到的选项。
1-
istringstream
对whitespace
完全正常,但对\
无效。
2-
strtok()
适用于char。所以我必须将我的字符串更改为char,我真的不想这样做。
3- Boost Tokenizer()
这个似乎很有趣,过去我对它没有任何熟悉,除了我刚才用Google搜索它。我复制了代码,它是这样的:
#include <boost/foreach.hpp>
#include <boost/tokenizer.hpp>
using namespace boost;
int main(){
string tempStr;
ifstream fin;
fin.open("input.txt");
int i=0;
while (!fin.eof()){
getline(fin,tempStr);
char_separator<char> sep("\"); // error: missing terminating " character
tokenizer<char_separator<char>> tokens(tempStr, sep);
for (const auto& t : tokens) {
cout << t << "." << endl;
}
}
现在这给出了"error: boost/foreach.hpp: No such file or directory"
的错误
可以有人在这帮助我还有其他better way
用\ delimiter
读取输入文件。请不要使用像class tokenizer()
这样的大量代码,因为我还在学习c ++。
编辑:我没有安装升级库,因此我遇到了这个错误。如果有人能够在不安装第三个库的情况下解释tokenize
字符串的更好方法,那将是非常有利的。
最佳; DeadCoder。
答案 0 :(得分:3)
在C ++(以及基于C的其他语言)中,字符串或字符文字中的\
字符是 escape 字符。这意味着它转义文字中的下一个字符。例如,你可以在字符串中包含"
。要在字符串文字中包含\
,您需要通过使用其中两个来转义反斜杠:"\\"
。
您可以在C ++中阅读有关有效转义序列的更多信息,例如in this reference
至于Boost的问题,你需要告诉编译器你在哪里安装它。这是在IDE的项目属性中完成的。
如果您想使用第三方库(如Boost)将标记为,则有两种方法。一种方法是使用std::istringstream
和std::getline
。另一个使用标准string
类的find
和substr
函数。
答案 1 :(得分:2)
这里任何类型的通用标记器都是矫枉过正的。只是用
std::find( s.begin(), s.end(), '\\' )
找到每个分隔符,
和std::string
的两个迭代器构造函数将它放入
单独的字符串。 (您的编译器将第一个\
视为
转义字符。)像:
std::vector<std::string> fields;
std::string::const_iterator end = s.end();
std::string::const_iterator current = s.begin();
std::string::const_iterator next
= std::find( current, end, '\\' ):
while ( next != end ) {
fields.push_back( std::string( current, next ) );
current = next + 1;
next = std::find( current, end, '\\' );
}
fields.push_back( std::string( current, next ) );
应该这样做。
答案 2 :(得分:1)
char_separator<char> sep("\")
^^^ You need to escape the \ . use "\\"
\
用于表示转义序列。但是to escape that escape, you need other escape
使用此:char_separator<char> sep("\\")
安装boost lib:Install Boost
其他选择:
getline(fin,tempStr);
char *cstr=new char[tempStr.length()+1];
strcpy(cstr,tempStr.c_str())
//... Now you can use strtok() on cstr