Stroustrup kısa süre önce C ++ ile ilgili popüler mitleri gözden düşüren bir dizi yazı yayınladı . Beşinci mit: “C ++ sadece büyük, karmaşık, programlar içindir”. Bunu boşaltmak için, bir web sayfasını indiren ve ondan bağlantılar çıkaran basit bir C ++ programı yazdı . İşte burada:
#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'a gerçekte küçük ve okunabilir bir programın ne olduğunu gösterelim .
- İndir
http://www.stroustrup.com/C++.html
Tüm bağlantıları listele:
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 ...
Herhangi bir dili kullanabilirsiniz, ancak üçüncü taraf kütüphanelerine izin verilmez.
kazanan
Oyların kazandığı C ++ cevabı , ancak kurallara uymayan yarı-üçüncü parti bir kütüphaneye dayanıyor ve başka bir yakın rakip Bash ile birlikte , saldırıya uğramış bir HTTP istemcisine güveniyor (HTTPS ile çalışmaz, gzip, yönlendirmeler vs.) Öyleyse Wolfram açık bir kazanan. Boyut ve okunabilirlik açısından yaklaşan bir başka çözüm de PowerShell'dir (yorumların iyileştirilmesiyle birlikte), ancak fazla dikkat çekmedi. Ana dilleri ( Python , C # ) da oldukça yaklaştı.
Content-Type: text/html; charset=UTF-8
... Ona e-posta göndereceğim.
boost/asio
hangi oraya kullanılır ise bir üçüncü taraf kitaplığı. Yani, standart kütüphanesinin bir parçası olarak url / tcp alma özelliğini içermeyen diller nasıl rekabet edecek?