Advertisement
salron3

Files

Jan 1st, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.62 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 //констата, където види SIZE го замества с 256
  7. #define NAMES 128
  8.  
  9. // Прототипи на функциите използвани по долу
  10. int menu();
  11. void getFileName(char* fileName, int mode);
  12. void GetNumberOfLoops(FILE *inputFile, FILE *outputFile);
  13. void PrintNumberOfRows(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 .txt/.c file and write to a file       |\n");
  56.     printf("| 2. Open a .txt/.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/.txt): ");
  79.             scanf("%s", fileName);      ///gets(fileName);
  80.  
  81.             if (fileName[strlen(fileName) - 4] == '.' && fileName[strlen(fileName) - 3] == 't' && fileName[strlen(fileName) - 2] == 'x' && fileName[strlen(fileName) - 1] == 't')
  82.             {
  83.                 return;
  84.             }
  85.  
  86.             if (fileName[strlen(fileName) - 2] == '.' && fileName[strlen(fileName) - 1] == 'c')// Проверка дали файла завършва на .c
  87.             {
  88.                 return;// Ако завършва се излиза от функцията
  89.             }
  90.         }
  91.  
  92.         if (mode == 2)// При мод 2 се въвежда име на файла за запис
  93.         {
  94.             printf("Enter File Name To Write (.c/.txt): ");
  95.             scanf("%s", fileName);      ///gets(fileName);
  96.  
  97.             if (fileName[strlen(fileName) - 4] == '.' && fileName[strlen(fileName) - 3] == 't' && fileName[strlen(fileName) - 2] == 'x' && fileName[strlen(fileName) - 1] == 't')
  98.             {
  99.                 return;
  100.             }
  101.  
  102.             if (fileName[strlen(fileName) - 2] == '.' && fileName[strlen(fileName) - 1] == 'c')// Проверка дали файла завършва на .c
  103.             {
  104.                 return;// Ако завършва се излиза от функцията
  105.             }
  106.         }
  107.     }
  108. }
  109.  
  110. void GetNumberOfLoops(FILE *inputFile, FILE *outputFile)
  111. {
  112.     int countOP = 0, i = 0, flag = 0, flag2 = 0;
  113.     char line[SIZE];
  114.     while (fgets(line, sizeof(line), inputFile) != NULL) //Четене ред по ред
  115.     {
  116.         for (i = 0; i < strlen(line); i++)
  117.         {
  118.  
  119.             if (line[i] == '\"' && !flag) flag = 1; // не търсим в къвичките
  120.             else if (line[i] == '\"' && line[i - 1] != '\\' && flag == 1) flag = 0;
  121.  
  122.             if (!flag && line[i] == '/' && line[i + 1] == '/') break; // при наличието на коментар спираме да четем реда
  123.  
  124.             if (!flag && line[i] == '/' && line[i + 1] == '*') flag = 2;// не търсим в големите коментари / *
  125.             else if (flag == 2 && line[i] == '*' && line[i + 1] == '/') flag = 0;
  126.  
  127.             if (line[i] == '\'' && !flag) flag = 3; // не търсим в апострофите;
  128.             else if (line[i] == '\'' && flag == 3) flag = 0;
  129.  
  130.             if (!flag){
  131.                 if (line[i] == 'f' && line[i + 1] == 'o' && line[i + 2] == 'r')    countOP++;// Проверка за for
  132.                 else if (line[i] == 'd' && line[i + 1] == 'o')// проверка за оператор do
  133.                 {
  134.                     flag2++;
  135.                 }
  136.                 else if ((line[i] == 'w' && line[i + 1] == 'h' && line[i + 2] == 'i' && line[i + 3] == 'l' && line[i + 4] == 'e') && flag2)// Проверка за оператор while
  137.                 {
  138.                     flag2--;
  139.                     countOP++;
  140.                 }
  141.                 else if ((line[i] == 'w' && line[i + 1] == 'h' && line[i + 2] == 'i' && line[i + 3] == 'l' && line[i + 4] == 'e') && flag2 == 0) countOP++;
  142.             }
  143.         }
  144.     }
  145.     fprintf(outputFile, "The number of 'For', 'While','Do/While' is: %d\n", countOP);// Запис на информацията
  146. }
  147.  
  148. void PrintNumberOfRows(FILE* inputFile, FILE* outputFile) //Функция за броене на редовете
  149. {
  150.     int currentRow = 0;
  151.  
  152.     char line[SIZE]; // декларираме стринг
  153.     while (fgets(line, sizeof(line), inputFile) != NULL) //Четене ред по ред
  154.     {
  155.         currentRow++;
  156.     }
  157.  
  158.     fprintf(outputFile, "Total rows in the program: %d\n", currentRow); //Записване на информацията в изходният файл
  159. }
  160.  
  161. int FileToFile()
  162. {
  163.     char readFile[NAMES] = { 0 }, writeFile[NAMES] = { 0 }; // Имената на файловете
  164.     FILE* inputFile, *outputFile; // Деклариране на файлов поинтър
  165.     getFileName(readFile, 1);// Въвеждане на името на файла за четене
  166.  
  167.     inputFile = fopen(readFile, "r"); // Отваряме файла за четене. "r" за четене
  168.     if (inputFile == NULL)// Проверка дали съществува файла
  169.     {
  170.         fprintf(stderr, "ERROR! CANNOT OPEN FILE!!!");
  171.         return; // Връщаме се към main-а
  172.     }
  173.  
  174.     getFileName(writeFile, 2);// Въвеждане на файла за писане
  175.     outputFile = fopen(writeFile, "w");// Проверка дали е отворен/създанен файл
  176.  
  177.     if (outputFile == NULL)
  178.     {
  179.         fprintf(stderr, "ERROR! CANNOT OPEN FILE!!!");
  180.         return;// Връщаме се към main-а
  181.     }
  182.  
  183.  
  184.     PrintNumberOfRows(inputFile, outputFile);//Викане на функцията за броене на редове
  185.     rewind(inputFile);// Връща файловия поинтър към началото на файла(за да може пак да се прочете)
  186.     GetNumberOfLoops(inputFile, outputFile);//Викане на функцията брояща циклите
  187.     printf("Information saved to \"%s\"\n", writeFile);
  188.  
  189.     fclose(inputFile);//затваряне на файла
  190.     fclose(outputFile);
  191.  
  192.     return 0;
  193. }
  194.  
  195. int FileToScreen()
  196. {
  197.     char readFile[NAMES] = { 0 };
  198.     FILE* inputFile;
  199.     getFileName(readFile, 1);
  200.  
  201.     inputFile = fopen(readFile, "r");// Отваряне на файла за четене
  202.     if (inputFile == NULL)
  203.     {
  204.         fprintf(stderr, "CANNOT OPEN FILE!");
  205.         return;
  206.     }
  207.  
  208.     PrintNumberOfRows(inputFile, stdout);// stdout e изходен поток за данни. Той превръща fprintf-a в обикновен printf
  209.     rewind(inputFile);// Връща файловия поинтър към началото на файла(за да може пак да се прочете)
  210.     GetNumberOfLoops(inputFile, stdout);
  211.  
  212.     fclose(inputFile);
  213.  
  214.     return 0;
  215. }
  216.  
  217. int ScreenToFile()
  218. {
  219.     char writeFile[NAMES] = { 0 }, manage[SIZE], c = 0;
  220.     FILE *outputFile, *tempBuffer;
  221.  
  222.     getFileName(writeFile, 2);// Въвеждане на името на файла за запис
  223.  
  224.     outputFile = fopen(writeFile, "w");//Отваря файла за писане
  225.     if (outputFile == NULL)// Проверка за дали файла е отворен(създаден)
  226.     {
  227.         fprintf(stderr, "CANNOT OPEN FILE!");// stderr поток за грешки
  228.         return;
  229.     }
  230.  
  231.     tempBuffer = fopen("TempChanges.tmp", "w");// Отваряне на временен файл за писане
  232.  
  233.     printf("\nWrite text under the line and type \"exit\" on a new line to save the information\n");
  234.     printf("________________________________________________________________________________\n");
  235.     fflush(stdin);
  236.  
  237.     while (1)
  238.     {
  239.         gets(manage);// Взима низ от клавиетурата
  240.         if (!strcmp(manage, "exit"))// Проверка дали се среща 'exit' във въведения от потребителя низ
  241.         {
  242.             fclose(tempBuffer);//ако се среща файла се затваря
  243.             tempBuffer = fopen("TempChanges.tmp", "r");// след това се отваря за четене
  244.             break;//излизане от безкрайният цикъл
  245.         }
  246.         fprintf(tempBuffer, "%s\n", manage);// Записване на низа въведен от потребителя
  247.     }
  248.  
  249.  
  250.     PrintNumberOfRows(tempBuffer, outputFile); // изивикваме функцията
  251.     rewind(tempBuffer); // Връща файловия поинтър към началото на файла(за да може пак да се прочете)
  252.     GetNumberOfLoops(tempBuffer, outputFile);
  253.  
  254.     printf("Information saved to \"%s\"\n", writeFile);
  255.  
  256.     fclose(outputFile);
  257.     fclose(tempBuffer);
  258.  
  259.     return 0;
  260. }
  261.  
  262. int ScreenToScreen()// Тук нещата са като по-горе
  263. {
  264.     char  manage[SIZE], c = 0;
  265.     FILE *tempBuffer;
  266.  
  267.     tempBuffer = fopen("TempChanges.tmp", "w");
  268.  
  269.     printf("\nWrite text under the line and type \"exit\" on a new line to save the information\n");
  270.     printf("________________________________________________________________________________\n");
  271.     fflush(stdin);
  272.  
  273.     while (1)
  274.     {
  275.         gets(manage); // Взима низ от клавиетурата
  276.         if (!strcmp(manage, "exit")) // Проверка дали се среща 'exit' във въведения от потребителя низ
  277.         {
  278.             fclose(tempBuffer); //ако се среща файла се затваря
  279.             tempBuffer = fopen("TempChanges.tmp", "r"); // след това се отваря за четене
  280.             break;//излизане от безкрайният цикъл
  281.         }
  282.         fprintf(tempBuffer, "%s\n", manage); // Записване на низа въведен от потребителя
  283.     }
  284.  
  285.     system("CLS");
  286.     printf("Information:\n");
  287.     PrintNumberOfRows(tempBuffer, stdout);
  288.     rewind(tempBuffer); // Връща файловия поинтър към началото на файла(за да може пак да се прочете)
  289.     GetNumberOfLoops(tempBuffer, stdout);
  290.  
  291.     fclose(tempBuffer); //затваряне на файла
  292.  
  293.     return 0;
  294. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement