Advertisement
salron3

Hosam

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