Многое зависит от того, что уже присутствует в вашем наборе инструментов. я много работаю
с файлами, которые приходят из Windows и читаются под Unix, и наоборот
наоборот, поэтому у меня есть большинство инструментов для преобразования CRLF в LF.
Если у вас его нет, вам может потребоваться функция, аналогичная:
void addLine( std::vector<std::string>& dest, std::string line )
{
if ( !line.empty() && *(line.end() - 1) == '\r' ) {
line.erase( line.end() - 1 );
}
if ( !line.empty() ) {
dest.push_back( line );
}
}
, чтобы сделать ваши вставки. Что касается разбивки исходного текста на строки,
Вы можете использовать std::istringstream
и std::getline
, как и другие
предложил; это просто и понятно, даже если это излишне.
(std::istringstream
- довольно тяжелый механизм, так как он поддерживает
все виды входных преобразований, которые вам не нужны.)
может рассмотреть цикл в соответствии с:
std::string::const_iterator start = textLine.begin();
std::string::const_iterator end = textLine.end();
std::string::const_iterator next = std::find( start, end, '\n' );
while ( next != end ) {
addLine( tokens, std::string( start, next ) );
start = next + 1;
next = std::find( start, end, '\n' );
}
addLine( tokens, std::string( start, end ) );
Или вы можете разбить вещи на отдельные операции:
textLine.erase(
std::remove( textLine.begin(), textLine.end(), '\r'),
textLine.end() );
чтобы избавиться от всех ЧР,
std::vector<std:;string> tokens( split( textLine, '\n' ) );
, разбить его на строки, где split
- обобщенная функция
вдоль линий вышеупомянутого цикла (полезный инструмент, чтобы добавить к
инструментарий) и, наконец,
tokens.erase(
std::remove_if( tokens.begin(), tokens.end(),
boost::bind( &std::string::empty, _1 ) ),
tokens.end() );
. (Вообще говоря: если это одна из ситуаций, используйте
std::istringstream
решение на основе. Если вы думаете, что, возможно, придется сделать
что-то подобное время от времени в будущем, добавьте split
использовать ваш набор и использовать его.)