stringtokenizer — читает входной файл с разделителем обратной косой черты (\). Переполнение стека

Мой входной файл выглядит так:

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

Я делаю дерево, и мне нужно абстрагировать имена каталогов при чтении из входного файла с \ разделитель. Как и в приведенном выше примере, мне нужно отдельно абстрагироваться от c :, users, 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() как я все еще учусь с ++.

РЕДАКТИРОВАТЬ: У меня не была установлена ​​библиотека Boost, поэтому у меня была эта ошибка. было бы очень полезно, если кто-то может объяснить лучший способ tokenize Строка без установки третьей библиотеки.

Лучший;
DeadCoder.

1

Решение

В C ++ (и других языках, основанных на C) \ символ в строке или символьном литерале является побег персонаж. Это значит ускользает следующий символ в буквальном. Это так, вы можете иметь, например, " внутри строки вообще. Иметь \ внутри строкового литерала вы должны избежать обратной косой черты, имея два из них: "\\",

Вы можете прочитать больше о допустимых escape-последовательностях в C ++, например. в этой ссылке.


Что касается проблемы с Boost, вам нужно сообщить компилятору, где вы его установили. Это делается в свойствах проекта вашей IDE.


Если вы хотите токенизировать без с помощью сторонней библиотеки, такой как Boost, существует несколько способов. Одним из способов может быть использование std::istringstream а также std::getline. Другой для использования find а также substr функции стандарта string учебный класс.

3

Другие решения

Любой обобщенный токенизатор здесь будет излишним. Просто используйте
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

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

\ используется для обозначения escape-последовательности. Но to escape that escape, you need other escape

Использовать этот : char_separator<char> sep("\\")

Чтобы установить boost lib: Установить Boost

Другой выбор:

getline(fin,tempStr);
char *cstr=new char[tempStr.length()+1];
strcpy(cstr,tempStr.c_str())

//... Now you can use strtok() on cstr
1