Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
inquisitor
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,763
1

Функция обновления валют через интернет

25.11.2016, 19:48. Просмотров 1013. Ответов 28
Метки нет (Все метки)

Суть вопроса
Создать программный продукт «Обмен валют»(студенческая лабораторка), который будет выполнять функции автоматического перевода денежных единиц в разные эквиваленты. Предусмотреть возможность работы с 10-ю различными валютами. Сделать возможным обновление курсов валют через Интернет. Предоставить возможность сохранения результатов в текстовый файл.
Программа должна быть написана на чистом СИ.

Как сделать само обновление?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2016, 19:48
Ответы с готовыми решениями:

Функция возведения в степень через рекурсию
Написал функцию возведения в степень для положительных чисел, но, к сожалению,...

Сделать обновления программы через интернет
Добрый день! Мне необходимо сделать обновления программы через интернет. Я...

Как организовать обновления своей программы через интернет?
Может кто занимался чем то подобным? как все это выглядит? допустим посмотрел я...

Сторонний скрипт для обновления курсов валют (OpenCart)
Всем привет, юзаю через крон автообновления курсов валют по привату: апи:...

Не удаётся установить обновления через Центр обновления Windows
После отката системы не получается обновиться через Центр обновления Windows....

28
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
25.11.2016, 20:19 2
socket, и тягайте с того же центрального банка курсы.
0
inquisitor
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,763
25.11.2016, 20:20  [ТС] 3
Цитата Сообщение от shvyrevvg Посмотреть сообщение
socket, и тягайте с того же центрального банка курсы.
Приведите пример.
0
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
25.11.2016, 20:29 4
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
Приведите пример.
Нээ, я спать пошел уже. Сторонние библиотеки можно использовать? Если нет, погуглите сокеты си. И http запрос. Утром может посмотрю.
1
inquisitor
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,763
25.11.2016, 21:53  [ТС] 5
Да можно использовать все,что не запрещено.
0
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
26.11.2016, 07:14 6
Лучший ответ Сообщение было отмечено scherbakovss201 как решение

Решение

scherbakovss201, если через сокеты, то вот пример(кривенько, но работает)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#include <windows.h>
 
#include <stdio.h>
#include <string.h>
 
#pragma comment(lib,"ws2_32.lib") //Winsock Library
 
#define strdup _strdup
 
//#define DEBUG
#define OFFSET 11 // число символов от назвая до значения
 
/*
<Cube currency='DKK' rate='7.4380'/>
<Cube currency='GBP' rate='0.85182'/>
<Cube currency='HUF' rate='309.33'/>
<Cube currency='PLN' rate='4.4190'/>
<Cube currency='RON' rate='4.5140'/>
<Cube currency='SEK' rate='9.7840'/>
<Cube currency='CHF' rate='1.0736'/>
<Cube currency='NOK' rate='9.0690'/>
<Cube currency='HRK' rate='7.5318'/>
<Cube currency='RUB' rate='68.4111'/>
<Cube currency='TRY' rate='3.6523'/>
<Cube currency='AUD' rate='1.4230'/>
<Cube currency='BRL' rate='3.6394'/>
<Cube currency='CAD' rate='1.4290'/>
<Cube currency='CNY' rate='7.3295'/>
<Cube currency='HKD' rate='8.2153'/>
<Cube currency='IDR' rate='14317.74'/>
<Cube currency='ILS' rate='4.1047'/>
<Cube currency='INR' rate='72.5925'/>
<Cube currency='KRW' rate='1247.03'/>
<Cube currency='MXN' rate='21.8727'/>
<Cube currency='MYR' rate='4.7203'/>
<Cube currency='NZD' rate='1.5040'/>
<Cube currency='PHP' rate='52.801'/>
<Cube currency='SGD' rate='1.5132'/>
<Cube currency='THB' rate='37.760'/>
<Cube currency='ZAR' rate='14.9718'/>
*/
 
char* OpenURL(char *url) {
    WSADATA lpWSAData;
    SOCKET s;
 
    // Проверим на правильность введенный адрес.
    // Он должен начинаться с "http://"
    if (memcmp(url,"HTTP://",7)!=0 && memcmp(url,"http://",7)!=0) return(NULL);
    url+=7;
 
    // Инициализация библиотеки Ws2_32.dll.
    if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0) return(NULL);
 
 
    // Получим имя хоста, номер порта и путь ----------------------------
 
    char *http_host=strdup(url); // Имя хоста (HTTP_HOST)
    int port_num=80;             // Номер порта по умолчанию (HTTP_PORT)
    char *http_path=NULL;        // Путь (REQUEST_URI)
 
    char *pch=strchr(http_host,':');
    if (!pch) {
        pch=strchr(http_host,'/');
        if (pch) {
            *pch=0;
            http_path=strdup(pch+1);
            }
        else http_path=strdup("");
        }
    else {
        *pch=0;pch++;
        char *pch1 = strchr(pch,'/');
        if (pch1) {
            *pch1=0;
            http_path=strdup(pch1+1);
            }
        else http_path=strdup("");
 
        port_num = atoi(pch);
 
        if (port_num==0) port_num = 80;
        }
 
    // Поучаем IP адрес по имени хоста
    struct hostent* hp;
    if (!(hp=gethostbyname(http_host))) {
        free(http_host);
        free(http_path);
        return(NULL);
        }
 
    // Открываем сокет
    s=socket(AF_INET, SOCK_STREAM, 0);
    if (s==INVALID_SOCKET) {
        free(http_host);
        free(http_path);
        return(NULL);
        }
 
    // Заполняем структуру sockaddr_in
    struct sockaddr_in ssin;
    memset ((char *)&ssin, 0, sizeof(ssin));
    ssin.sin_family = AF_INET;
    ssin.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr[0];
    ssin.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr[1];
    ssin.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr[2];
    ssin.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr[3];
    ssin.sin_port = htons(port_num);
#ifdef DEBUG
    // Выводим IP адрес хоста, с которым будем соединятся
    printf("Conecting to %d.%d.%d.%d...",(unsigned char)hp->h_addr[0],
                                         (unsigned char)hp->h_addr[1],
                                         (unsigned char)hp->h_addr[2],
                                         (unsigned char)hp->h_addr[3]);
#endif  
 
    // Соединяемся с хостом
    if (connect(s, (struct sockaddr *)(&ssin), sizeof(ssin))==-1) {
        free(http_host);
        free(http_path);
        printf("Error\n");
        return(NULL);
    }
#ifdef DEBUG
    printf("Ok\n");
#endif
    // Формируем HTTP запрос
    char *query=(char*)malloc(2048);
 
    strcpy(query,"GET /");
    strcat(query,http_path);
    strcat(query," HTTP/1.0\nHost: ");
    strcat(query,http_host);
    strcat(query,"\nUser-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
    strcat(query,"\nAccept: */*\n\n");
 
#ifdef DEBUG
    // Выводим HTTP запрос
    printf("%s",query);
#endif
    // Отправляем запрос серверу
    int cnt=send(s,query,strlen(query),0);
 
    // Освобождаем память
    free(http_host);
    free(http_path);
    free(query);
 
    // Проверяем, не произошло ли ошибки при отправке запроса на сервер
     if (cnt==SOCKET_ERROR) return(NULL);
 
    cnt=1;
 
    // Получаем ответ с сервера ---------------------------------
 
    int size=1024*1024; // 1Mb
    char *result=(char*)malloc(size);
    strcpy(result,"");
    char *result_ptr=result;
 
    while (cnt!=0 && size>0) {
        cnt=recv (s, result_ptr, sizeof(size),0);
        if (cnt>0) {
            result_ptr+=cnt;
            size-=cnt;
            }
        }
    *result_ptr=0;
 
    // Деинициализация библиотеки Ws2_32.dll
    WSACleanup();
 
    return(result);
    }
 
int main(void) 
{
    char *result=OpenURL("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");
    float value = 0;
 
    if (sscanf(strstr(result, "USD") + OFFSET,"%f", &value ) == 1)
        printf("USD: %f\n", value);
 
    if (sscanf(strstr(result, "JPY") + OFFSET,"%f", &value ) == 1)
        printf("JPY: %f\n", value);
 
    if (sscanf(strstr(result, "BGN") + OFFSET,"%f", &value ) == 1)
        printf("BGN: %f\n", value);
 
    if (sscanf(strstr(result, "CZK") + OFFSET,"%f", &value ) == 1)
        printf("CZK: %f\n", value);
 
    free(result);
    return 0;
}
Можно библиотеку libcurl подключить(меньше кода будет и он для разных платформ есть). Или бинарник curl и через system("curl.exe http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml > tmp.txt") и потом из файла доставать курсы.
1
inquisitor
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,763
26.11.2016, 17:45  [ТС] 7
скопировал ваш код в VS 2013
и вот ошибка компиляции
Функция обновления валют через интернет
0
MihaelK
20 / 20 / 9
Регистрация: 25.11.2016
Сообщений: 105
26.11.2016, 17:53 8
я так полагаю нужно вначале кода написать
C++
1
#define _CRT_SECURE_NO_WARNINGS
либо переписать код под использование strcpy_s
strcpy() только в двух местах вызывается, такчто переделок мало будет
0
inquisitor
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,763
26.11.2016, 18:31  [ТС] 9
Добавил директиву в начало кода
Цитата Сообщение от MihaelK Посмотреть сообщение
#define _CRT_SECURE_NO_WARNINGS
Заменил strcpy на strcpy_s
Функция обновления валют через интернет
0
MihaelK
20 / 20 / 9
Регистрация: 25.11.2016
Сообщений: 105
26.11.2016, 18:35 10
"либо" это синоним или, что означает что нужно выполнить один вариант а не оба сразу.
"переписать код под использование strcpy_s " не означает просто переименовать вызов функции,
нужно изучить какие она аргументы принимает и в соответствии с этим поправить.
0
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
26.11.2016, 18:51 11
Если добавили директиву, то менять на strcpy_s не нужно. Перед всеми #include
Цитата Сообщение от MihaelK Посмотреть сообщение
C
1
#define _CRT_SECURE_NO_WARNINGS
1
inquisitor
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,763
26.11.2016, 19:29  [ТС] 12
Цитата Сообщение от shvyrevvg Посмотреть сообщение
Если добавили директиву, то менять на strcpy_s не нужно. Перед всеми #include
Функция обновления валют через интернет

макрос не определен перед всеми инклайдами.
0
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
26.11.2016, 19:32 13
Лучший ответ Сообщение было отмечено scherbakovss201 как решение

Решение

Цитата Сообщение от scherbakovss201 Посмотреть сообщение
макрос не определен перед всеми инклайдами.
Свойства проекта -> С/C++ ->Предварительно откомпилированные заголовки->Не использовать..
1
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
26.11.2016, 19:35 14
Кликните здесь для просмотра всего текста
Функция обновления валют через интернет
1
inquisitor
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,763
26.11.2016, 19:51  [ТС] 15
Цитата Сообщение от shvyrevvg Посмотреть сообщение
Свойства проекта -> С/C++ ->Предварительно откомпилированные заголовки->Не использовать..
Функция обновления валют через интернет

Да заработало.
А где в коде регулируется,какие курсы выводить и сколько?
0
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
26.11.2016, 19:59 16
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
где в коде регулируется,какие курсы выводить и сколько?
Ответ сайта хранится в result. Чтобы из result получить курс USD нужно
C
1
2
if (sscanf(strstr(result, "USD") + OFFSET,"%f", &value ) == 1) // в value запишется курс EUR/USD
        printf("USD: %f\n", value);
Для других валют пишите вместо "USD" см. закоммент. в коде.
1
inquisitor
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,763
01.12.2016, 16:14  [ТС] 17
а как результат вывода курсов на консоль сохранить у файл?
0
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
01.12.2016, 16:37 18
C
1
2
3
4
5
if (sscanf(strstr(result, "USD") + OFFSET,"%f", &value ) == 1) // в value запишется курс EUR/USD
        printf("USD: %f\n", value);
FILE* fd = fopen("1.txt", "w");
fprintf(fd, "USD: %f\n", value);
fclose(fd);
0
inquisitor
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,763
03.12.2016, 12:15  [ТС] 19
Если это* возможно чтобы в про*грамме валют можно бы*ло ввести кол-во един*иц опр. валюты и пере*вести во все валюты с*разу используя ранее *выведенные индексы ил*и в одну конкретную?
0
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
03.12.2016, 13:07 20
А в чем проблема? Сложно одно число разделить на другое?
1
03.12.2016, 13:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2016, 13:07

Функция курса валют
помогите пожалуйста.. мне нужно сделать так что при вводе в любое окно любое...

как раздать интернет по wi-fi через ноутбук если интернет к нему поделючен через WI-fi
Значит так, есть 3 ноутбука с Wi-fi. Я хочу с одного ноута раздавать инетернет...

Не скачиваются обновления через центр обновления
Доброго времени суток! Недавно решил проверить наличие обновлений у себя на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru