salron3

Blocks

Dec 18th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.59 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #define SIZE 256
  7. #define NAMES 128
  8.  
  9. // Прототипи на функциите използвани по долу
  10. int menu();
  11. void getFileName(char* fileName, int mode);
  12. void GetNumberOfComments(FILE* inputFile, FILE* outputFile);
  13. void GetNumberOfBlocks(FILE *inputFile, FILE *outputFile);
  14. int FileToFile();
  15. int FileToScreen();
  16. int ScreenToFile();
  17. int ScreenToScreen();
  18.  
  19. int main()
  20. {
  21.     while (1)
  22.     {
  23.         switch (menu())
  24.         {
  25.         case 1:
  26.             FileToFile();
  27.             break;
  28.         case 2:
  29.             FileToScreen();
  30.             break;
  31.         case 3:
  32.             ScreenToFile();
  33.             break;
  34.         case 4:
  35.             ScreenToScreen();
  36.             break;
  37.         case 0:
  38.             exit(0);
  39.         default:
  40.             break;
  41.         }
  42.  
  43.         system("pause");
  44.         system("cls");
  45.     }
  46.     return 0;
  47. }
  48.  
  49. int menu()
  50. {
  51.     int i;
  52.  
  53.     printf(" ________________M A I N   M E N U_________________\n");
  54.     printf("|                                                  |\n");
  55.     printf("| 1. Open a .c file and write to a file            |\n");
  56.     printf("| 2. Open a .c file and write to the screen        |\n");
  57.     printf("| 3. Enter text and write to a file                |\n");
  58.     printf("| 4. Enter text and write to the screen            |\n");
  59.     printf("| 0. Exit                                          |\n");
  60.     printf("|__________________________________________________|\n");
  61.  
  62.     do //while (i<0 || i>4);
  63.     {
  64.         fflush(stdin);// Чисти буфера
  65.         printf("Select Option: ");
  66.         scanf("%d", &i);
  67.     } while (i<0 || i>4);// Позволява въвеждане на числа само между 0 и 4
  68.     return i;// Връщаме избраната стойност
  69. }
  70.  
  71. void getFileName(char* fileName, int mode) /// 1 TO OPEN A FILE TO READ /// 2 TO OPEN A FILE TO WRITE ///
  72. {
  73.     while (1)// Безкраен цикъл
  74.     {
  75.         fflush(stdin);
  76.         if (mode == 1) // Ако е подадено 1 ще се изисква потребителя да въведе име на файл за четене
  77.         {
  78.             printf("Enter File Name To Read (.c): ");
  79.             scanf("%s", fileName);      ///gets(fileName);
  80.  
  81.             if (fileName[strlen(fileName) - 2] == '.' && fileName[strlen(fileName) - 1] == 'c')// Проверка дали файла завършва на .c
  82.             {
  83.                 return;// Ако завършва се излиза от функцията
  84.             }
  85.         }
  86.  
  87.         if (mode == 2)// При мод 2 се въвежда име на файла за запис
  88.         {
  89.             printf("Enter File Name To Write (.c/.txt): ");
  90.             scanf("%s", fileName);      ///gets(fileName);
  91.  
  92.             if (fileName[strlen(fileName) - 4] == '.' && fileName[strlen(fileName) - 3] == 't' && fileName[strlen(fileName) - 2] == 'x' && fileName[strlen(fileName) - 1] == 't')
  93.             {
  94.                 return;
  95.             }
  96.  
  97.             if (fileName[strlen(fileName) - 2] == '.' && fileName[strlen(fileName) - 1] == 'c')// Проверка дали файла завършва на .c
  98.             {
  99.                 return;// Ако завършва се излиза от функцията
  100.             }
  101.         }
  102.     }
  103. }
  104.  
  105. void GetNumberOfBlocks(FILE *inputFile, FILE *outputFile) // брои блоковете { }
  106. {
  107.     int flag = 0; // декларираме флаг
  108.     int closingBlocks = 0;
  109.     int openingBlocks = 0;
  110.     char line[SIZE]; // декларираме стринг
  111.     while (fgets(line, sizeof(line), inputFile) != NULL) //Четене ред по ред
  112.     {
  113.         for (size_t i = 0; i < strlen(line); i++) //четем символ по символ всеки прочетен ред
  114.         {
  115.  
  116.             if (line[i] == '\"' && !flag) flag = 1; // ако има намерена " вдигаме флага и не търсим в къвичките
  117.             else if (line[i] == '\"' && line[i - 1] != '\\' && flag == 1) flag = 0; //изключваме флага, когато намерим къде се затваря
  118.  
  119.             if (!flag && line[i] == '/' && line[i + 1] == '/') break; // при наличието на коментар спираме да четем реда
  120.  
  121.             if (!flag && line[i] == '/' && line[i + 1] == '*') flag = 2;// не търсим в големите коментари / *
  122.             else if (flag == 2 && line[i] == '*' && line[i + 1] == '/') flag = 0; //изключваме флага, когато намерим къде се затваря * /
  123.  
  124.             if (line[i] == '\'' && !flag) flag = 3; // не търсим в апострофите;
  125.             else if (line[i] == '\'' && flag == 3) flag = 0; //изключваме флага, когато намерим къде се затваря
  126.  
  127.             if (!flag) //Ако флагът не е вдигнат
  128.             {
  129.                 if (line[i] == '{')
  130.                     openingBlocks++;
  131.  
  132.                 if (line[i] == '}')
  133.                     closingBlocks++;
  134.             }
  135.         }
  136.     }
  137.  
  138.     if (closingBlocks == openingBlocks) //ако броя на затворените и отворените блокове е еднакъв
  139.     {
  140.         fprintf(outputFile, "The number of blocks is: %d\n", closingBlocks);// Записваме броя на затворените блокове
  141.     }
  142.     else //в противен случай
  143.     {
  144.         fprintf(stderr, "WARNING! Unclosed block of code \n");
  145.     }
  146. }
  147.  
  148. void GetNumberOfComments(FILE* inputFile, FILE* outputFile) //Функция за броене на броя коментарите
  149. {
  150.     int numberOfComments = 0;
  151.     int multylineComment = 0;
  152.     char line[256];
  153.     char currentChar = ' ';
  154.  
  155.     while ((currentChar = fgetc(inputFile)) != EOF) //Чете докато не стигне край на файла
  156.     {
  157.         int i = 0;
  158.         while (currentChar != '\n' && currentChar != EOF)//Прочита 1 ред
  159.         {
  160.             line[i++] = currentChar; //записва в масива
  161.             currentChar = fgetc(inputFile);
  162.         }
  163.  
  164.         line[i] = '\0';
  165.         if (i != 0) //Ако има прочетен ред
  166.         {
  167.             for (size_t j = 0; j < i - 1; j++)
  168.             {
  169.                 if (line[j] == '/' && multylineComment == 0)
  170.                 {
  171.                     if (line[j + 1] == '/')
  172.                     {
  173.                         numberOfComments++;
  174.                     }
  175.                     else if (line[j + 1] == '*')
  176.                     {
  177.                         multylineComment = 1;
  178.                     }
  179.                 }
  180.                 else if (line[j] == '*' && line[j + 1] == '/')
  181.                 {
  182.                     multylineComment = 0;
  183.                     numberOfComments++;
  184.                 }
  185.             }
  186.         }
  187.     }
  188.     fprintf(outputFile, "Total comments: %d\n", numberOfComments); //Записване на информацията в изходният файл
  189. }
  190.  
  191. int FileToFile()
  192. {
  193.     char readFile[NAMES] = { 0 }, writeFile[NAMES] = { 0 }; // Имената на файловете
  194.     FILE* inputFile, *outputFile; // Деклариране на файлов поинтър
  195.     getFileName(readFile, 1);// Въвеждане на името на файла за четене
  196.  
  197.     inputFile = fopen(readFile, "r"); // Отваряме файла за четене. "r" за четене
  198.     if (inputFile == NULL)// Проверка дали съществува файла
  199.     {
  200.         fprintf(stderr, "ERROR! CANNOT OPEN FILE!!!");
  201.         return; // Връщаме се към main-а
  202.     }
  203.  
  204.     getFileName(writeFile, 2);// Въвеждане на файла за писане
  205.     outputFile = fopen(writeFile, "w");// Проверка дали е отворен/създанен файл
  206.  
  207.     if (outputFile == NULL)
  208.     {
  209.         fprintf(stderr, "ERROR! CANNOT OPEN FILE!!!");
  210.         return;// Връщаме се към main-а
  211.     }
  212.  
  213.     GetNumberOfBlocks(inputFile, outputFile);//Викане на функцията брояща блоковете
  214.     rewind(inputFile);// Връща файловия поинтър към началото на файла(за да може пак да се прочете)
  215.     GetNumberOfComments(inputFile, outputFile);//Викане на функцията за броене на коментари
  216.     printf("Information saved to \"%s\"\n", writeFile);
  217.  
  218.     fclose(inputFile);//затваряне на файла
  219.     fclose(outputFile);
  220.  
  221.     return 0;
  222. }
  223.  
  224. int FileToScreen()
  225. {
  226.     char readFile[NAMES] = { 0 };
  227.     FILE* inputFile;
  228.     getFileName(readFile, 1);
  229.  
  230.     inputFile = fopen(readFile, "r");// Отваряне на файла за четене
  231.     if (inputFile == NULL)
  232.     {
  233.         fprintf(stderr, "CANNOT OPEN FILE!");
  234.         return;
  235.     }
  236.  
  237.     GetNumberOfBlocks(inputFile, stdout);//Викане на функцията брояща блоковете
  238.     rewind(inputFile);// Връща файловия поинтър към началото на файла(за да може пак да се прочете)
  239.     GetNumberOfComments(inputFile, stdout);//Викане на функцията за броене на коментари
  240.  
  241.     fclose(inputFile);
  242.  
  243.     return 0;
  244. }
  245.  
  246. int ScreenToFile()
  247. {
  248.     char writeFile[NAMES] = { 0 }, manage[SIZE], c = 0;
  249.     FILE *outputFile, *tempBuffer;
  250.  
  251.     getFileName(writeFile, 2);// Въвеждане на името на файла за запис
  252.  
  253.     outputFile = fopen(writeFile, "w");//Отваря файла за писане
  254.     if (outputFile == NULL)// Проверка за дали файла е отворен(създаден)
  255.     {
  256.         fprintf(stderr, "CANNOT OPEN FILE!");// stderr поток за грешки
  257.         return;
  258.     }
  259.  
  260.     tempBuffer = fopen("TempChanges.tmp", "w");// Отваряне на временен файл за писане
  261.  
  262.     printf("\nWrite text under the line and type \"exit\" on a new line to save the information\n");
  263.     printf("________________________________________________________________________________\n");
  264.     fflush(stdin);
  265.  
  266.     while (1)
  267.     {
  268.         gets(manage);// Взима низ от клавиетурата
  269.         if (!strcmp(manage, "exit"))// Проверка дали се среща 'exit' във въведения от потребителя низ
  270.         {
  271.             fclose(tempBuffer);//ако се среща файла се затваря
  272.             tempBuffer = fopen("TempChanges.tmp", "r");// след това се отваря за четене
  273.             break;//излизане от безкрайният цикъл
  274.         }
  275.         fprintf(tempBuffer, "%s\n", manage);// Записване на низа въведен от потребителя
  276.     }
  277.  
  278.  
  279.     GetNumberOfBlocks(tempBuffer, outputFile);
  280.     rewind(tempBuffer); // Връща файловия поинтър към началото на файла(за да може пак да се прочете)
  281.     GetNumberOfComments(tempBuffer, outputFile);//Викане на функцията за броене на коментари
  282.  
  283.     printf("Information saved to \"%s\"\n", writeFile);
  284.  
  285.     fclose(outputFile);
  286.     fclose(tempBuffer);
  287.  
  288.     return 0;
  289. }
  290.  
  291. int ScreenToScreen()// Тук нещата са като по-горе
  292. {
  293.     char  manage[SIZE], c = 0;
  294.     FILE *tempBuffer;
  295.  
  296.     tempBuffer = fopen("TempChanges.tmp", "w");
  297.  
  298.     printf("\nWrite text under the line and type \"exit\" on a new line to save the information\n");
  299.     printf("________________________________________________________________________________\n");
  300.     fflush(stdin);
  301.  
  302.     while (1)
  303.     {
  304.         gets(manage); // Взима низ от клавиетурата
  305.         if (!strcmp(manage, "exit")) // Проверка дали се среща 'exit' във въведения от потребителя низ
  306.         {
  307.             fclose(tempBuffer); //ако се среща файла се затваря
  308.             tempBuffer = fopen("TempChanges.tmp", "r"); // след това се отваря за четене
  309.             break;//излизане от безкрайният цикъл
  310.         }
  311.         fprintf(tempBuffer, "%s\n", manage); // Записване на низа въведен от потребителя
  312.     }
  313.  
  314.     system("CLS");
  315.     printf("Information:\n");
  316.  
  317.     GetNumberOfBlocks(tempBuffer, stdout);
  318.     rewind(tempBuffer); // Връща файловия поинтър към началото на файла(за да може пак да се прочете)
  319.     GetNumberOfComments(tempBuffer, stdout); //Викане на функцията за броене на коментари
  320.  
  321.     fclose(tempBuffer); //затваряне на файла
  322.  
  323.     return 0;
  324. }
Advertisement
Add Comment
Please, Sign In to add comment