Построковый форматированый вывод из файла - 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; }
Объяснение кода листинга программы
- В начале кода определяются две константы: SIZE (размер массива в структуре Package) и PSIZE (количество пакетов).
- Создается структура Package, которая содержит массив double array размером SIZE.
- В основной функции main() открывается файл X.txt для чтения с помощью функции fopen().
- Создается переменная iterator для отслеживания индекса текущего элемента массива.
- Создаются переменные n, d и l, которые используются для хранения чисел с плавающей точкой, прочитанных из файла.
- Используется цикл for с условием, которое включает в себя чтение символа из файла с помощью функции fgetc().
- Если символ является концом файла (EOF), то выполняется блок кода, который записывает значение n + d / l в соответствующий элемент массива.
- Если символ является переносом строки (\n), то выполняется блок кода, который записывает значение n + d / l в соответствующий элемент массива и увеличивает индекс пакета.
- Если символ является пробелом (' '), то выполняется блок кода, который записывает значение n + d / l в соответствующий элемент массива и увеличивает индекс элемента и пакета.
- Если символ является точкой ('.'), то значение l устанавливается равным 1.
- Если значение l отрицательно, то значение n увеличивается на значение c - 48.
- В противном случае значение d увеличивается на значение c - 48, а l умножается на 10.
- После окончания чтения файла выполняется цикл for, который проходит по всем пакетам и выводит значения их массивов на экран с помощью функции printf().
- Функция fclose() закрывает файл, открытый в функции main().
- Выполняется функция system(), которая приостанавливает выполнение программы до нажатия клавиши.
- Возвращается значение 222.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д