2013-02-22 81 views
1

我的输入文件是这样的:阅读与反斜线()分隔符C++输入文件

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

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

1-istringstream适用于whitespace,但不适用于\

2-strtok()适用于char。所以我将不得不将我的字符串更改为字符,我真的不想这样做。

3- Boost Tokenizer()这一个看起来很有趣,过去我对它没有任何的了解,除了我刚刚使用了它之外。我复制的代码,它是这样的:

#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字符串,而不安装第三个库,那将是非常有利的。

Best; DeadCoder。

+0

有你'安装Boost'库? – Mahesh 2013-02-22 17:06:00

+0

没有。那不是默认的。 – DeadCoder 2013-02-22 17:06:53

+0

这是一个第三方库。从http://www.boost.org/下载它 – Mahesh 2013-02-22 17:07:49

回答

3

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

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


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


如果你想使用第三方库,如升压来标记没有,有一对夫妇的方式。一种方法可以是使用std::istringstreamstd::getline。另一个使用标准string类的findsubstr函数。

+0

好吧,但我真的需要知道为什么我必须使用两个\\。因为你在上面的陈述中对我没有意义。 – DeadCoder 2013-02-22 17:17:35

+0

@DeadCoder你知道如何在字符串中编写一个文字换行符吗?你使用'“\ n”'对吗?这与使用'“\\”'表示单个反斜杠相同。字符或字符串中的反斜杠_literal_告诉编译器,下一个字符是一个特殊的字符,意味着别的东西。 – 2013-02-22 17:21:02

+0

@DeadCoder你必须使用两个\\因为这是定义语言的方式。 – 2013-02-22 17:21:04

1
char_separator<char> sep("\") 
          ^^^ You need to escape the \ . use "\\" 

\用于指示转义序列。但是,to escape that escape, you need other escape

用这个:char_separator<char> sep("\\")

要安装升压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 
+0

非常感谢....现在对我更有意义。 – DeadCoder 2013-02-22 17:24:38

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)); 

应该做的伎俩。

+0

谢谢.....每一天新的东西学习..... :) – DeadCoder 2013-02-22 17:32:02