Stroustrup baru-baru ini memposting serangkaian postingan yang menghilangkan mitos populer tentang C ++ . Mitos kelima adalah: "C ++ hanya untuk program yang besar, rumit,". Untuk menghilangkan prasangka itu, ia menulis sebuah program C ++ sederhana yang mengunduh halaman web dan mengekstraksi tautan darinya . Ini dia:
#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;
}
}
Mari kita tunjukkan pada Stroustrup apa program kecil dan mudah dibaca itu sebenarnya.
- Unduh
http://www.stroustrup.com/C++.html
Daftar semua tautan:
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 ...
Anda dapat menggunakan bahasa apa pun, tetapi tidak ada perpustakaan pihak ketiga yang diizinkan.
Pemenang
Jawaban C ++ dimenangkan oleh suara, tetapi bergantung pada pustaka pihak ketiga (yang tidak diizinkan oleh aturan), dan, bersama dengan pesaing dekat lainnya Bash , bergantung pada klien HTTP yang diretas bersama (tidak akan bekerja dengan HTTPS, gzip, arahan ulang dll). Jadi Wolfram adalah pemenang yang jelas. Solusi lain yang mendekati dalam hal ukuran dan keterbacaan adalah PowerShell (dengan peningkatan dari komentar), tetapi belum mendapat banyak perhatian. Bahasa arus utama ( Python , C # ) juga cukup dekat.
Content-Type: text/html; charset=UTF-8
... Saya akan mengirim email kepadanya.
boost/asio
digunakan di sana yang merupakan perpustakaan pihak ketiga. Maksud saya, bagaimana bahasa yang tidak menyertakan url / tcp fetching sebagai bagian dari perpustakaan standarnya akan bersaing?