Мой входной файл выглядит так:
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.
В C ++ (и других языках, основанных на C) \
символ в строке или символьном литерале является побег персонаж. Это значит ускользает следующий символ в буквальном. Это так, вы можете иметь, например, "
внутри строки вообще. Иметь \
внутри строкового литерала вы должны избежать обратной косой черты, имея два из них: "\\"
,
Вы можете прочитать больше о допустимых escape-последовательностях в C ++, например. в этой ссылке.
Что касается проблемы с Boost, вам нужно сообщить компилятору, где вы его установили. Это делается в свойствах проекта вашей IDE.
Если вы хотите токенизировать без с помощью сторонней библиотеки, такой как Boost, существует несколько способов. Одним из способов может быть использование std::istringstream
а также std::getline
. Другой для использования find
а также substr
функции стандарта string
учебный класс.
Любой обобщенный токенизатор здесь будет излишним. Просто используйте
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 ) );
должен сделать свое дело.
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