Есть программа, которая из одного файла формирует данные в другой файл. Необходимо написать в коде этой программы мини-тесты для трех ip-адресов:
- 91.236.122.136
- 23.77.211.71
- 188.233.112.40
Найти, какому диапазону принадлежит ip-адрес и вывести страну. Диапазон это столбец, где через дефис прописываются 2 ip-адреса, например, 2.0.0.0 - 2.15.255.255. Страна это две латинские буквы. В выходном файле все это видно. На выходе может быть не один диапазон и не одна страна. Это не важно.
Исходный файл:
Код:
#
# The contents OF this file are subject TO
# RIPE DATABASE Terms AND Conditions
#
# http://www.ripe.net/db/support/db-terms-conditions.pdf
#
inetnum: 194.206.161.47 - 194.206.161.47
netname: FR-RPN-HOLDING
descr: RPN Holding
descr: ZI nord BP 7132
descr: 01007
descr: Bourg en Bresse
country: FR
admin-c: DUMY-RIPE
tech-c: DUMY-RIPE
STATUS: ASSIGNED PA
mnt-BY: OLEANE-NOC
created: 1970-01-01T00:00:00Z
last-modified: 2001-09-21T22:08:01Z
SOURCE: RIPE
remarks: ****************************
remarks: * THIS OBJECT IS MODIFIED
remarks: * Please note that ALL DATA that IS generally regarded AS personal
remarks: * DATA has been removed FROM this object.
remarks: * TO VIEW the original object, please query the RIPE DATABASE at:
remarks: * http://www.ripe.net/whois
remarks: ****************************
% Tags relating TO '194.206.161.47 - 194.206.161.47'
% RIPE-USER-RESOURCE
inetnum: 213.159.160.0 - 213.159.191.255
netname: SE-ERICSSON-20010504
country: DK
org: ORG-EA44-RIPE
admin-c: DUMY-RIPE
tech-c: DUMY-RIPE
STATUS: ALLOCATED PA
mnt-BY: RIPE-NCC-HM-MNT
mnt-BY: ERICSSON-MNT
created: 1970-01-01T00:00:00Z
last-modified: 2016-06-29T09:54:17Z
SOURCE: RIPE
remarks: ****************************
remarks: * THIS OBJECT IS MODIFIED
remarks: * Please note that ALL DATA that IS generally regarded AS personal
remarks: * DATA has been removed FROM this object.
remarks: * TO VIEW the original object, please query the RIPE DATABASE at:
remarks: * http://www.ripe.net/whois
remarks: ****************************
Файл в таком формате получается на выходе:
Код:
33554432 34603007 2.0.0.0 - 2.15.255.255 FR -
34604544 34605055 2.16.6.0 - 2.16.7.255 DE -
34612224 34612735 2.16.36.0 - 2.16.37.255 IL -
34620416 34620927 2.16.68.0 - 2.16.69.255 SE -
34620928 34621439 2.16.70.0 - 2.16.71.255 IT -
34621952 34622463 2.16.74.0 - 2.16.75.255 NL -
34636800 34637311 2.16.132.0 - 2.16.133.255 DE -
34646528 34647551 2.16.170.0 - 2.16.173.255 DE -
34648576 34649087 2.16.178.0 - 2.16.179.255 GR -
34659328 34660351 2.16.220.0 - 2.16.223.255 GR -
34673664 34674687 2.17.20.0 - 2.17.23.255 DE -
34733056 34734079 2.17.252.0 - 2.17.255.255 DE -
34754560 34758655 2.18.80.0 - 2.18.95.255 GR -
Вот сам код:
Код:
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#pragma warning(disable:4996)
int parse(const char* from, const char* to) {
FILE *pFileIn, *pFileOut;
pFileIn = fopen(from, "r");
pFileOut = fopen(to, "w");
if (pFileIn == NULL || pFileOut == NULL) {
return NULL;
}
int i;
char buff[BUFSIZ];
uint8_t ip1[4];
uint8_t ip2[4];
char country[3];
while (fscanf(pFileIn, "%s", buff) != EOF) {
if (strcmp(buff, "inetnum:") == 0) {
fscanf(
pFileIn,
" %hhu.%hhu.%hhu.%hhu - %hhu.%hhu.%hhu.%hhu",
&ip1[0], &ip1[1], &ip1[2], &ip1[3],
&ip2[0], &ip2[1], &ip2[2], &ip2[3]
);
}
else if (strcmp(buff, "country:") == 0) {
fscanf(pFileIn, "%2s", country);
uint32_t i1 = ((uint32_t)ip1[0] << 24) | ((uint32_t)ip1[1] << 16) | ((uint32_t)ip1[2] << 8) | ip1[3];
uint32_t i2 = ((uint32_t)ip2[0] << 24) | ((uint32_t)ip2[1] << 16) | ((uint32_t)ip2[2] << 8) | ip2[3];
fprintf(pFileOut,
"%zu %zu %hhu.%hhu.%hhu.%hhu - %hhu.%hhu.%hhu.%hhu %s -\n",
i1, i2,
ip1[0], ip1[1], ip1[2], ip1[3],
ip2[0], ip2[1], ip2[2], ip2[3],
country
);
}
else {
fscanf(pFileIn, "%*[^\n]\n", NULL);
}
}
fclose(pFileIn);
fclose(pFileOut);
return 1;
}
int main()
{
if (parse("D:\\1\\inetnum.txt", "D:\\1\\output.txt") == NULL) {
return 1;
}
return 0;
}