/*Вывести на экран содержимое файла с программой на языке С, выделяя в строке все заголовки функций*/ #include #include #include #define BEGIN 1 #define END 0 //#define _CRT_SECURE_NO_WARNINGS 1 void main(void) { FILE *f; HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); char line[1024]; // считываемая строка файла int i=0, flag=0, flag_hdr=0; // flag - на комментарий, flag_hdr - на заголовок f=fopen("test.txt", "r"); if (f==NULL) return; while (! feof(f)) { fgets (line, 1024, f); if (strstr(line, "/*") && !strstr(line, "*/")) flag=BEGIN; if ((((strstr(line, "int "))!=NULL)||(strstr(line, "void "))!=NULL) && (strstr(line, "["))==NULL && (strstr(line, "="))==NULL || (flag_hdr!=END) || (flag==BEGIN)) // если в строке есть тип INT или VOID, открывающая скобка и это не объявление и инициализация переменной или уже ранее начался заголовок { for (i=0; line[i]!='\0'; i++) // пока не закончится строка { /*Если встречен просто комментарий*/ /*то, начиная с //, всё записывать (белым) и выход из цикла (переход на след строку)*/ SetConsoleTextAttribute(handle, 15); // белый if (line[i]=='/' && line[i+1]=='/') { printf(strstr(line,"//")); break; } else { /*Если встречен граничный комментарий*/ /*поднять на него флаг и записывать всё (белым), пока очередные символы не будут закрывающей границей*/ if (line [i]=='/' && line [i+1]=='*' || flag==BEGIN) { flag=BEGIN; printf("%c", line[i]); if (line[i-1]=='*' && line [i]=='/') flag=END; if (line[i]=='\0') break; } else /*Если встречена ;*/ /*написать её (белым)*/ if ((line[i]==';') || (line[i]==' ')) printf("%c", line[i]); /*Если встречено всё остальное*/ /*записывать красным, вернуть белый*/ else { if ((flag!=BEGIN) || (flag_hdr!=END)) // если это не часть ранее открытого комментария или заголовок уже начался { SetConsoleTextAttribute(handle, 12); // красный printf("%c", line[i]); flag_hdr=BEGIN; if (strstr(line, ")")) flag_hdr=END; } } } } } else // если не строка с заголовком { SetConsoleTextAttribute(handle, 15); printf(line); } } fclose (f); }