Построковый форматированый вывод из файла - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, прошу особо не серчать, в си я недавно. В общем такая ситуация, есть файл каждая строка из которого является частью сетевого пакета(в примере 10 строк, но в дальнейшем работа будет с гораздо более крупными файлами более 100000 строк). Нужно брать каждую строку, дробить ее на части и эти части помещать в отдельный элемент структуры. Все элементы в структуре double так как выгружать из структуры в дальнейшем я буду в double. Почему не работает и не логичней если все элементы в конечном итоге должны быть приведены к одному типу данных сделать все не через структуру а через массив? И если логичнее то где можно посмотреть как? Код индусский и отвратительный З.Ы. Содержание файла: 0 1 1 2 181 5450 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 8 8 0.00 0.00 0.00 0.00 1.00 0.00 0.00 9 9 1.00 0.00 0.11 0.00 0.00 0.00 0.00 0.00 0 1 1 2 239 486 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 8 8 0.00 0.00 0.00 0.00 1.00 0.00 0.00 19 19 1.00 0.00 0.05 0.00 0.00 0.00 0.00 0.00 0 1 1 2 235 1337 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 8 8 0.00 0.00 0.00 0.00 1.00 0.00 0.00 29 29 1.00 0.00 0.03 0.00 0.00 0.00 0.00 0.00 0 1 1 2 219 1337 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 6 6 0.00 0.00 0.00 0.00 1.00 0.00 0.00 39 39 1.00 0.00 0.03 0.00 0.00 0.00 0.00 0.00 0 1 1 2 217 2032 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 6 6 0.00 0.00 0.00 0.00 1.00 0.00 0.00 49 49 1.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0 1 1 2 217 2032 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 6 6 0.00 0.00 0.00 0.00 1.00 0.00 0.00 59 59 1.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0 1 1 2 212 1940 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 2 0.00 0.00 0.00 0.00 1.00 0.00 1.00 1 69 1.00 0.00 1.00 0.04 0.00 0.00 0.00 0.00 0 1 1 2 159 4087 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 5 5 0.00 0.00 0.00 0.00 1.00 0.00 0.00 11 79 1.00 0.00 0.09 0.04 0.00 0.00 0.00 0.00 0 1 1 2 210 151 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 8 8 0.00 0.00 0.00 0.00 1.00 0.00 0.00 8 89 1.00 0.00 0.12 0.04 0.00 0.00 0.00 0.00 0 1 1 2 212 786 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 8 8 0.00 0.00 0.00 0.00 1.00 0.00 0.00 8 99 1.00 0.00 0.12 0.05 0.00 0.00 0.00 0.00 Код:
#include <stdio.h>
struct data
{
    double a; //duration 
    double b;//protocol_type 
    double c;//service 
    double d;//flag 
    double e;//src_bytes 
    double f;//dst_bytes 
    double g;//land 
    double h;//wrong_fragment 
    double i;//urgent 
    double j;//hot 
    double k;//num_failed_logins 
    double l;//logged_in 
    double m;//num_compromised 
    double n;//root_shell 
    double o;//su_attempted 
    double p;//num_root 
    double q;//num_file_creations 
    double r;//num_shells 
    double s;//num_access_files 
    double t;//num_outbound_cmds 
    double u;//is_host_login 
    double v;//is_guest_login 
    double w;//count 
    double x;//srv_count 
    double y;//serror_rate 
    double z;//srv_serror_rate 
    double aa;//rerror_rate 
    double bb;//srv_rerror_rate 
    double cc;//same_srv_rate 
    double dd;//diff_srv_rate 
    double ee;//srv_diff_host_rate 
    double ff;//dst_host_count 
    double gg;//dst_host_srv_count 
    double hh;//dst_host_same_srv_rate 
    double ii;//dst_host_diff_srv_rate 
    double jj;//dst_host_same_src_port_rate 
    double kk;//dst_host_srv_diff_host_rate 
    double ll;//dst_host_serror_rate 
    double mm;//dst_host_srv_serror_rate 
    double nn;//dst_host_rerror_rate 
    double oo;//dst_host_srv_rerror_rate 
    //int target;//type_attac
}
 
main () { 
    const int N = 9;
    FILE *file;
    struct data dat[N];
 
    char i1=0;
 
    file = fopen("OpenData.txt", "r");
 
    while (fscanf (file, "2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f%2.f", &(dat[i1].a), &(dat[i1].b),&(dat[i1].c), &(dat[i1].d),&(dat[i1].e), &(dat[i1].f),&(dat[i1].g),  
        &(dat[i1].h), &(dat[i1].i),&(dat[i1].j), &(dat[i1].k),&(dat[i1].l), &(dat[i1].m), &(dat[i1].n), 
            &(dat[i1].o), &(dat[i1].p),&(dat[i1].q), &(dat[i1].r),&(dat[i1].s), &(dat[i1].t), &(dat[i1].u),
                &(dat[i1].v), &(dat[i1].w),&(dat[i1].x), &(dat[i1].y),&(dat[i1].z), &(dat[i1].aa), &(dat[i1].bb), 
                    &(dat[i1].cc), &(dat[i1].dd),&(dat[i1].ee), &(dat[i1].ff),&(dat[i1].gg), &(dat[i1].hh), &(dat[i1].ii),
                        &(dat[i1].jj), &(dat[i1].kk),&(dat[i1].ll), &(dat[i1].mm), &(dat[i1].nn), &(dat[i1].oo)) != EOF) {
                        printf("%2.f  %2.f  %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f %2.f\n", dat[i1].a, dat[i1].b,dat[i1].c, dat[i1].d,dat[i1].e, dat[i1].f,dat[i1].g,  
                            dat[i1].h, dat[i1].i,dat[i1].j, dat[i1].k,dat[i1].l, dat[i1].m, dat[i1].n, 
                                dat[i1].o, dat[i1].p,dat[i1].q, dat[i1].r,dat[i1].s, dat[i1].t, dat[i1].u,
                                    dat[i1].v, dat[i1].w,dat[i1].x, dat[i1].y,dat[i1].z, dat[i1].aa, dat[i1].bb, 
                                        dat[i1].cc, dat[i1].dd,dat[i1].ee, dat[i1].ff,dat[i1].gg, dat[i1].hh, dat[i1].ii,
                                            dat[i1].jj, dat[i1].kk,dat[i1].ll, dat[i1].mm, dat[i1].nn, dat[i1].oo); 
                        i1++;
    }
    fclose(file);
}

Решение задачи: «Построковый форматированый вывод из файла»

textual
Листинг программы
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
#define SIZE 41
#define PSIZE 10 //Кол-во пакетов
 
struct Package
{
    double array[SIZE];
};
 
int main()
{
    struct Package packages[PSIZE];
 
    FILE *input = fopen("X.txt", "r");
 
    int iterator = 0;
    double n = 0;
    double d = 0;
    double l = 1;
 
 
    for (int c = 0, i = 0; (c = fgetc(input));)
    {
        if (c == EOF)
        {
            packages[i].array[iterator] = n + d / l;
            break;
        }
        if (c == '\n')
        {
            packages[i].array[iterator] = n + d / l;
            i++;
            n = 0;
            d = 0;
            l = -1;
            iterator = 0;
            continue;
        }
        if (c == ' ')
        {
            packages[i].array[iterator] = n + d / l;
            iterator++;
            n = 0;
            d = 0;
            l = -1;
            continue;
        }
        if (c == '.')
        {
            l = 1;
            continue;
        }
        if (l < 0)
        {
            n = n * 10 + c - 48;
        }
        else
        {
            d = d * 10 + c - 48;
            l *= 10;
        }
    }
 
 
 
    for (int x = 0; x < PSIZE; x++)
    {
        for (int i = 0; i < SIZE; i++)
            printf("%.2f ", packages[x].array[i]);
        putchar('\n');
    }
 
    fclose(input);
 
    system("pause");
    return 222;
}

Объяснение кода листинга программы

  1. В начале кода определяются две константы: SIZE (размер массива в структуре Package) и PSIZE (количество пакетов).
  2. Создается структура Package, которая содержит массив double array размером SIZE.
  3. В основной функции main() открывается файл X.txt для чтения с помощью функции fopen().
  4. Создается переменная iterator для отслеживания индекса текущего элемента массива.
  5. Создаются переменные n, d и l, которые используются для хранения чисел с плавающей точкой, прочитанных из файла.
  6. Используется цикл for с условием, которое включает в себя чтение символа из файла с помощью функции fgetc().
  7. Если символ является концом файла (EOF), то выполняется блок кода, который записывает значение n + d / l в соответствующий элемент массива.
  8. Если символ является переносом строки (\n), то выполняется блок кода, который записывает значение n + d / l в соответствующий элемент массива и увеличивает индекс пакета.
  9. Если символ является пробелом (' '), то выполняется блок кода, который записывает значение n + d / l в соответствующий элемент массива и увеличивает индекс элемента и пакета.
  10. Если символ является точкой ('.'), то значение l устанавливается равным 1.
  11. Если значение l отрицательно, то значение n увеличивается на значение c - 48.
  12. В противном случае значение d увеличивается на значение c - 48, а l умножается на 10.
  13. После окончания чтения файла выполняется цикл for, который проходит по всем пакетам и выводит значения их массивов на экран с помощью функции printf().
  14. Функция fclose() закрывает файл, открытый в функции main().
  15. Выполняется функция system(), которая приостанавливает выполнение программы до нажатия клавиши.
  16. Возвращается значение 222.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.571 из 5
Похожие ответы