diff --git a/.gitignore b/.gitignore index c6d2f6a..0a4fc6b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ /bin /obj - +/curl diff --git a/curl_utils.cpp b/curl_utils.cpp new file mode 100644 index 0000000..0263a45 --- /dev/null +++ b/curl_utils.cpp @@ -0,0 +1,55 @@ +#define CURL_STATICLIB // Для статической линковки +#include +#include + +#include "histogram.h" + + +#include + + +static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) { + size_t real_size = size * nmemb; + std::stringstream* buffer = static_cast(userp); + buffer->write(static_cast(contents), real_size); + return real_size; +} + +Input download(const std::string& url) { + CURL* curl = curl_easy_init(); + std::stringstream buffer; + + if(!curl) { + std::cerr << "Ошибка: не удалось инициализировать cURL" << std::endl; + exit(EXIT_FAILURE); + } + + + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); + + CURLcode res = curl_easy_perform(curl); + + if(res != CURLE_OK) { + std::cerr << "Ошибка cURL (" << res << "): " + << curl_easy_strerror(res) << std::endl; + + const char* url_info; + if(curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url_info) == CURLE_OK) { + std::cerr << "URL: " << url_info << std::endl; + } + + curl_easy_cleanup(curl); + exit(EXIT_FAILURE); + } + + if(buffer.str().empty()) { + std::cerr << "Ошибка: получен пустой ответ от сервера" << std::endl; + curl_easy_cleanup(curl); + exit(EXIT_FAILURE); + } + + curl_easy_cleanup(curl); + return input_data(buffer, false); +} diff --git a/histogram.cpp b/histogram.cpp index e281a24..5672fab 100644 --- a/histogram.cpp +++ b/histogram.cpp @@ -47,17 +47,28 @@ std::vector make_histogram(const std::vector& numbers, size_t bi return bins; } -Input input_data() { - Input in; - std::cin >> in.number_count; +Input input_data(std::istream& in, bool prompt) { // Без = true здесь! + Input result; - in.numbers.resize(in.number_count); - for (size_t i = 0; i < in.number_count; i++) { - std::cin >> in.numbers[i]; + if (prompt) { + std::cerr << "Введите количество чисел: "; } + in >> result.number_count; - std::cin >> in.bin_count; - return in; + if (prompt) { + std::cerr << "Введите " << result.number_count << " чисел: "; + } + result.numbers.resize(result.number_count); + for (size_t i = 0; i < result.number_count; i++) { + in >> result.numbers[i]; + } + + if (prompt) { + std::cerr << "Введите количество корзин: "; + } + in >> result.bin_count; + + return result; } void show_histogram_text(const vector& bins, size_t block_width) { diff --git a/histogram.h b/histogram.h index 6fccc34..42a262d 100644 --- a/histogram.h +++ b/histogram.h @@ -2,6 +2,7 @@ #define HISTOGRAM_H #include +#include struct Input { std::vector numbers; @@ -9,8 +10,11 @@ struct Input { size_t number_count; }; -Input input_data(); + +Input input_data(std::istream& in = std::cin, bool prompt = true); std::vector make_histogram(const std::vector& numbers, size_t bin_count); void show_histogram_text(const std::vector& bins, size_t max_width = 80); +Input download(const std::string& url); + #endif diff --git a/histogram.svg b/histogram.svg index c4bca7f..ac3df2e 100644 --- a/histogram.svg +++ b/histogram.svg @@ -1,13 +1,16 @@ 1 - - -3 - - + + +0 + + 1 - - - + + +1 + + + diff --git a/lab1.depend b/lab1.depend index 4a96dde..fcb2a9f 100644 --- a/lab1.depend +++ b/lab1.depend @@ -1,14 +1,16 @@ # depslib dependency file v1.0 -1750586188 source:c:\users\taa41\desktop\прога\lab1\main.cpp +1751634290 source:c:\users\taa41\desktop\прога\lab1\main.cpp "histogram.h" "svg.h" + -1749173822 c:\users\taa41\desktop\прога\lab1\histogram.h +1751737430 c:\users\taa41\desktop\прога\lab1\histogram.h + -1750586035 source:c:\users\taa41\desktop\прога\lab1\svg.cpp +1750586646 source:c:\users\taa41\desktop\прога\lab1\svg.cpp "svg.h" @@ -19,7 +21,7 @@ -1750444430 source:c:\users\taa41\desktop\прога\lab1\histogram.cpp +1751552407 source:c:\users\taa41\desktop\прога\lab1\histogram.cpp "histogram.h" "histogram_internal.h" @@ -30,3 +32,168 @@ 1749200462 c:\users\taa41\desktop\прога\lab1\histogram_internal.h +1751736810 source:c:\users\taa41\desktop\прога\lab1\curl_utils.cpp + + + "histogram.h" + + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\curl.h + "curlver.h" + "system.h" + + + + + + + + + + + "easy.h" + "multi.h" + "urlapi.h" + "options.h" + "header.h" + "websockets.h" + "mprintf.h" + "typecheck-gcc.h" + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\curlver.h + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\system.h + + + + + + + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\easy.h + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\multi.h + "curl.h" + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\urlapi.h + "curl.h" + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\options.h + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\header.h + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\websockets.h + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\mprintf.h + + + "curl.h" + +1751633274 c:\users\taa41\desktop\прога\curl\curl-8.14.1\include\curl\typecheck-gcc.h + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\curl.h + "curlver.h" + "system.h" + + + + + + + + + + + "easy.h" + "multi.h" + "urlapi.h" + "options.h" + "header.h" + "websockets.h" + "mprintf.h" + "typecheck-gcc.h" + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\curlver.h + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\system.h + + + + + + + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\easy.h + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\multi.h + "curl.h" + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\urlapi.h + "curl.h" + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\options.h + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\header.h + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\websockets.h + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\mprintf.h + + + "curl.h" + +1751634753 c:\users\taa41\desktop\прога\curl\curl-8.14.1_2-win64a-mingw\include\curl\typecheck-gcc.h + +1751635109 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\curl.h + "curlver.h" + "system.h" + + + + + + + + + + + "easy.h" + "multi.h" + "urlapi.h" + "options.h" + "header.h" + "websockets.h" + "mprintf.h" + "typecheck-gcc.h" + +1751635109 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\curlver.h + +1751635110 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\system.h + + + + + + + +1751635109 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\easy.h + +1751635110 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\multi.h + "curl.h" + +1751635110 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\urlapi.h + "curl.h" + +1751635110 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\options.h + +1751635110 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\header.h + +1751635110 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\websockets.h + +1751635110 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\mprintf.h + + + "curl.h" + +1751635110 c:\curl\curl-8.14.1_2-win64-mingw\include\curl\typecheck-gcc.h + diff --git a/lab1.layout b/lab1.layout index 6b37ae0..08be647 100644 --- a/lab1.layout +++ b/lab1.layout @@ -2,29 +2,29 @@ - + - + - + - + - + - + - + - + - + - + diff --git a/main.cpp b/main.cpp index 974d81b..6ec9eff 100644 --- a/main.cpp +++ b/main.cpp @@ -1,25 +1,61 @@ #include #include +#include +#include #include "histogram.h" #include "svg.h" +#include + using namespace std; -int main() { - Input data = input_data(); - auto bins = make_histogram(data.numbers, data.bin_count); +static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) { + size_t real_size = size * nmemb; + stringstream* buffer = static_cast(userp); + buffer->write(static_cast(contents), real_size); + return real_size; +} + + +int main(int argc, char* argv[]) { + +Input download(const std::string& url); + + curl_global_init(CURL_GLOBAL_ALL); + + Input input; + + + if(argc > 1) { + try { + input = download(argv[1]); + } catch(const exception& e) { + cerr << "Ошибка загрузки: " << e.what() << endl; + curl_global_cleanup(); + return EXIT_FAILURE; + } + } else { + input = input_data(cin, true); + } + + auto bins = make_histogram(input.numbers, input.bin_count); + show_histogram_text(bins); int dash_len, gap_len; - cout << "Enter dash length (e.g., 20): "; + cout << "Введите длину штриха (например, 20): "; cin >> dash_len; - cout << "Enter gap length (e.g., 10): "; + cout << "Введите длину промежутка (например, 10): "; cin >> gap_len; - show_histogram_text(bins); - ofstream svg_file("histogram.svg"); - svg::show_histogram_svg(svg_file, bins, dash_len, gap_len); - svg_file.close(); + if(svg_file) { + svg::show_histogram_svg(svg_file, bins, dash_len, gap_len); + cout << "Гистограмма сохранена в histogram.svg" << endl; + } else { + cerr << "Ошибка: не удалось создать файл SVG" << endl; + } + + curl_global_cleanup(); - return 0; + return EXIT_SUCCESS; }