Stroustrup 은 최근 C ++에 대한 대중적인 신화를 폭파하는 일련의 게시물을 게시했습니다 . 다섯 번째 오해는“C ++은 크고 복잡한 프로그램만을위한 것”입니다. 그것을 파기하기 위해 그는 웹 페이지를 다운로드하고 링크를 추출 하는 간단한 C ++ 프로그램을 작성 했습니다 . 여기있어:
#include <string>
#include <set>
#include <iostream>
#include <sstream>
#include <regex>
#include <boost/asio.hpp>
using namespace std;
set<string> get_strings(istream& is, regex pat)
{
set<string> res;
smatch m;
for (string s; getline(is, s);) // read a line
if (regex_search(s, m, pat))
res.insert(m[0]); // save match in set
return res;
}
void connect_to_file(iostream& s, const string& server, const string& file)
// open a connection to server and open an attach file to s
// skip headers
{
if (!s)
throw runtime_error{ "can't connect\n" };
// Request to read the file from the server:
s << "GET " << "http://" + server + "/" + file << " HTTP/1.0\r\n";
s << "Host: " << server << "\r\n";
s << "Accept: */*\r\n";
s << "Connection: close\r\n\r\n";
// Check that the response is OK:
string http_version;
unsigned int status_code;
s >> http_version >> status_code;
string status_message;
getline(s, status_message);
if (!s || http_version.substr(0, 5) != "HTTP/")
throw runtime_error{ "Invalid response\n" };
if (status_code != 200)
throw runtime_error{ "Response returned with status code" };
// Discard the response headers, which are terminated by a blank line:
string header;
while (getline(s, header) && header != "\r")
;
}
int main()
{
try {
string server = "www.stroustrup.com";
boost::asio::ip::tcp::iostream s{ server, "http" }; // make a connection
connect_to_file(s, server, "C++.html"); // check and open file
regex pat{ R"((http://)?www([./#\+-]\w*)+)" }; // URL
for (auto x : get_strings(s, pat)) // look for URLs
cout << x << '\n';
}
catch (std::exception& e) {
std::cout << "Exception: " << e.what() << "\n";
return 1;
}
}
Stroustrup에게 작고 읽기 쉬운 프로그램이 실제로 무엇인지 보여 주십시오.
- 다운로드
http://www.stroustrup.com/C++.html
모든 링크를 나열하십시오.
http://www-h.eng.cam.ac.uk/help/tpl/languages/C++.html http://www.accu.org http://www.artima.co/cppsource http://www.boost.org ...
모든 언어를 사용할 수 있지만 타사 라이브러리는 허용되지 않습니다.
우승자
C ++ 답변 은 투표로 이겼지 만 반 타사 라이브러리 (규칙에 의해 허용되지 않음) 에 의존 하고 다른 가까운 경쟁자 Bash 와 함께 해킹 된 HTTP 클라이언트에 의존합니다 (HTTPS에서는 작동하지 않습니다, gzip, 리디렉션 등). 따라서 Wolfram 은 확실한 승자입니다. 크기와 가독성 측면에서 가까운 또 다른 솔루션은 PowerShell (설명을 개선 한 것)이지만 많은 관심을받지 못했습니다. 주류 언어 ( Python , C # )도 매우 가까워졌습니다.
Content-Type: text/html; charset=UTF-8
... 나는 그를 이메일로 보낼 것입니다.
boost/asio
한 거기 사용되는 것입니다 타사 라이브러리. 표준 라이브러리의 일부로 url / tcp 가져 오기를 포함하지 않는 언어는 어떻게 경쟁합니까?