开发者

Having a string how to get its contents from first `/r/n/r/n` until 2 lines from string end?

开发者 https://www.devze.com 2023-03-23 08:34 出处:网络
I try to create simple file upload service in C++. I get all user request body as one big string. User can upload any type of data. I need to get only user file contents from request boby string.

I try to create simple file upload service in C++. I get all user request body as one big string. User can upload any type of data. I need to get only user file contents from request boby string.

so for example now I have next code working with my service API provider:

std::cout << "Request body: " << request->body << std::endl << "Request size: " <<  request->body.len开发者_JS百科gth() << std::endl;

and this would print as:

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

So I need to get from request->body (which is string) all data from first /r/n/r/n until last line -2 lines. How to do such thing with string in C++?


This isn't the most elegant approach, but one option would be to do something like this:

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


You can use regular expressions for that. This page has some nice c++ examples: http://www.math.utah.edu/docs/info/libg++_19.html

0

精彩评论

暂无评论...
验证码 换一张
取 消