Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > C/C++ Базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 20.07.2019, 12:17   #1
klmnoprst
Новичок
Джуниор
 
Регистрация: 20.07.2019
Сообщений: 1
Радость Мини-тесты для программы

Есть программа, которая из одного файла формирует данные в другой файл. Необходимо написать в коде этой программы мини-тесты для трех 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;
}
http://medicina-treat.ru
klmnoprst вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мини-фабрика, по производству мини-фабрик/дронов для сбора воды. Определить минимальное время для сбора заданного количеста воды kukobch Паскаль, Turbo Pascal, PascalABC.NET 12 17.10.2016 00:39
Создание мини-робота и программы для него на языке С++ NAZIRA_MUNALBAEVA Фриланс 2 03.04.2012 14:21
Мини программы в паскале Rimoru Паскаль, Turbo Pascal, PascalABC.NET 4 17.11.2011 19:02
Тесты по С++ Sergey240892 Помощь студентам 4 08.06.2011 10:00
Оценка программы Тесты 2009 Андрей123 Софт 5 25.07.2009 21:35