diff --git a/main.cpp b/main.cpp index daaac3e..ae6fb02 100644 --- a/main.cpp +++ b/main.cpp @@ -1,65 +1,95 @@ #include #include -#include #include "histogram.h" #include "text.h" #include "svg.h" +#include +#include +#include using namespace std; struct Input { - vector dn; vector numbers; size_t bin_count{}; - size_t number_count{}; - size_t max_count{}; }; -Input -input_data(istream& cin, bool prompt) { - if (prompt == true){ - Input in; - cerr << "Enter number count: "; - cin >> in.number_count; - vector numbers(in.number_count); - in.numbers.resize(in.number_count); - for (size_t i = 0; i < in.number_count; i++) { - cin >> in.numbers[i]; - } - size_t bin_count; - cerr << "Enter bin count: "; - cin >> in.bin_count; +Input input_data(istream& stream, bool prompt) { - size_t max_count; - in.max_count = 0; - return in; + + size_t number_count; + if (prompt) { + cerr << "Enter number count: "; } - else{ + stream >> number_count; + Input in; - cin >> in.number_count; - vector numbers(in.number_count); - in.numbers.resize(in.number_count); - for (size_t i = 0; i < in.number_count; i++) { - cin >> in.numbers[i]; + + in.numbers.resize(number_count); + + if (prompt){ + cerr << "Enter numbers: "; + } + for (size_t i = 0; i < number_count; i++) + { + stream >> in.numbers[i]; } - size_t bin_count; - cin >> in.bin_count; - size_t max_count; - in.max_count = 0; - return in; + if (prompt){ + cerr << "Enter number of bins: "; } + stream >> in.bin_count; + + return in; +} + +size_t write_data(void* items, size_t item_size, size_t item_count, void* ctx) { // размер принятых данных в байтах, иначе curl_easy_perform() остановит работу с ошибкой. + size_t data_size = item_size * item_count; + stringstream* buffer = reinterpret_cast(ctx); // stringstream — поток, который может читать из буфера в памяти. + auto text = reinterpret_cast(items); + buffer->write(text, data_size); + return data_size; } +Input download(const string& address) { -int main(){ + stringstream buffer; curl_global_init(CURL_GLOBAL_ALL); - bool res = false; + CURL* curl = curl_easy_init(); // CURL* - дескриптор, сложный объект, передавать их функциям библиотеки и сравнивать между собой + + if(curl) { + + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, address.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); // библиотека может вызывать функцию, которую укажет программа. + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); + res = curl_easy_perform(curl); + + if (res != CURLE_OK) { + curl_easy_strerror(res); + exit(1); + } + cerr << res << endl; + curl_easy_cleanup(curl); + } + return input_data(buffer, false); +} + + + + +int main(int argc, char* argv[]){ + + Input in; + if (argc > 1) { + in = download(argv[1]); + } else { + in = input_data(cin, true); + } - auto in = input_data(cin, true); auto bins = make_histogram(in.numbers, in.bin_count);