使用反斜杠(\)分隔符c ++读取输入文件

时间:2013-02-22 17:03:59

标签: c++ stringtokenizer boost-tokenizer

我的输入文件是这样的:

C:\Users\DeadCoder\AppData\Local\CoCreate

我正在创建一个树,我需要在使用\分隔符从输入文件中读取时抽象目录的名称。就像上面的例子一样,我需要单独抽象c:,用户,DeadCoder,Appdata ....我希望每个人都能理解这些问题。 现在让我们看看我们得到的选项。

1- istringstreamwhitespace完全正常,但对\无效。

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。

3 个答案:

答案 0 :(得分:3)

在C ++(以及基于C的其他语言)中,字符串或字符文字中的\字符是 escape 字符。这意味着它转义文字中的下一个字符。例如,你可以在字符串中包含"。要在字符串文字中包含\,您需要通过使用其中两个来转义反斜杠:"\\"

您可以在C ++中阅读有关有效转义序列的更多信息,例如in this reference


至于Boost的问题,你需要告诉编译器你在哪里安装它。这是在IDE的项目属性中完成的。


如果您想使用第三方库(如Boost)将标记为,则有两种方法。一种方法是使用std::istringstreamstd::getline。另一个使用标准string类的findsubstr函数。

答案 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