Имея строку, как получить ее содержимое от первого `/ r / n / r / n` до 2 строк от конца строки? - PullRequest
0 голосов
/ 26 июля 2011

Я пытаюсь создать простой сервис загрузки файлов на C ++.Я получаю все тело запроса пользователя как одну большую строку.Пользователь может загрузить любой тип данных.Мне нужно получить только содержимое пользовательского файла из строки запроса.

, поэтому, например, теперь у меня есть следующий код, работающий с моим поставщиком API сервиса:

std::cout << "Request body: " << request->body << std::endl << "Request size: " <<  request->body.length() << std::endl;

, и это будет печататься как:

Request body: ------WebKitFormBoundaryAZlJcLinxYi6OCzX
Content-Disposition: form-data; name="datafile"; filename="crossdomain.xml"
Content-Type: text/xml

я╗┐<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-
omain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>
------WebKitFormBoundaryAZlJcLinxYi6OCzX--

Request size: 411

Так что мне нужно получить из запроса-> тело (которое является строкой) все данные от первой /r/n/r/n до последней строки -2 строки.Как это сделать со строкой в ​​C ++?

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

Это не самый элегантный подход, но одним из вариантов будет сделать что-то вроде этого:

std::string contents = /* ... get the string ... */

/* Locate the start point. */
unsigned startPoint = contents.find("\r\n\r\n");
if (startPoint == string::npos) throw runtime_error("Malformed string.");

/* Locate the end point by finding the last newline, then backing up
 * to the newline before that.
 */
unsigned endPoint = contents.rfind('\n');
if (endPoint == string::npos || endPoint == 0) throw runtime_error("Malformed string.");
endPoint = contents.rfind('\n', endPoint - 1);
if (endPoint == string::npos) throw runtime_error("Malformed string.");

/* Hand back that slice of the string. */
return std::string(contents.begin() + startPoint, contents.begin() + endPoint);
0 голосов
/ 26 июля 2011

Вы можете использовать регулярные выражения для этого.На этой странице есть несколько хороших примеров c ++: http://www.math.utah.edu/docs/info/libg++_19.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...