Advertisement
CherMi

Lab 10 final version

Nov 7th, 2019
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.68 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. void replace_tabs(char *str, char *out);
  6.  
  7. int main()
  8. {
  9.     char str1[1024] = { 0 }, str2[1024] = { 0 };
  10.     char str[1024] = { 0 };
  11.     char *ptr;
  12.     char strost[1024] = { 0 };
  13.     int dif, max_length, len;
  14.     FILE *in, *out;
  15.     char err_msg[] = "An error has occured";
  16.  
  17.     in = fopen("C:\\test\\file.txt", "rt"); //Открываем исходный файл для чтения
  18.     if (in == NULL) //Если не открылся
  19.     {
  20.         perror(err_msg);
  21.         return -1;
  22.     }
  23.     out = fopen("C:\\test\\lab10output.txt", "wt"); //Открываем исходный файл для записи
  24.     if (out == NULL) //Если не открылся
  25.     {
  26.         fclose(in);
  27.         perror(err_msg);
  28.         return -1;
  29.     }
  30.     fseek(in, 0, SEEK_END); // Переходим в конец файла
  31.     if (ftell(in) == 0) // Если файл пустой
  32.     {
  33.         printf("The file is empty.");
  34.         fclose(in);
  35.         fclose(out);
  36.         remove(out);
  37.         return 0;
  38.     }
  39.     fseek(in, 0, SEEK_SET); // Возвращение указателя в начало файла
  40.     max_length = -1;
  41.     while (fgets(str1, 256, in) != NULL) //Поиск наибольшей строки
  42.     {
  43.         replace_tabs(str1, str); //Заменяем символы табуляции и удаляем '\n'
  44.         len = strlen(str);
  45.         if (len > max_length)
  46.             max_length = len;
  47.     }
  48.     if (!feof)
  49.     { //Если ошибка
  50.         perror(err_msg);
  51.         fclose(in);
  52.         fclose(out);
  53.         return -1;
  54.     }
  55.     else
  56.     { //Если конец файла
  57.         fseek(in, 0, SEEK_SET); //Возвращаемся в начало файла
  58.     }
  59.  
  60.     len = max_length / 2; //Новая длина строк
  61.  
  62.     if (fgets(str1, 256, in) == NULL) //Точно не конец файла, т.к. он непустой
  63.     {
  64.         perror(err_msg);
  65.         fclose(in);
  66.         fclose(out);
  67.         return -1;
  68.     }
  69.    
  70.     replace_tabs(str1, str);
  71.     strcpy(str1, str);
  72.     while (1)
  73.     {
  74.         if (strlen(str1) < len) //Если в строке не хватает символов
  75.         {
  76.             if (fgets(str2, 256, in) != NULL) //Считать следующую строку
  77.             {
  78.                 replace_tabs(str2, str);
  79.                 strcpy(str2, str);
  80.             }
  81.             else
  82.             {
  83.                 if (feof) //Если конец файла
  84.                 {
  85.                     str1[strlen(str1)] = '\0';
  86.                     fputs(str1, out); //Записать неотформатированную строку str1
  87.                     break;
  88.                 }
  89.                 else //Если ошибка
  90.                 {
  91.                     perror(err_msg);
  92.                     fclose(in);
  93.                     fclose(out);
  94.                     return -1;
  95.                 }
  96.             }
  97.             dif = len - strlen(str1); //Кол-во недостающих символов
  98.             strncat(str1, str2, dif); //Присоединяем dif символов из str2 к str1
  99.             strcpy(strost, str2 + dif); //strost - неиспользованные символы str2
  100.             strcpy(str2, strost); //Переносим остаток в str2
  101.  
  102.             if (strlen(str1) < len) //Если всех символов str2 оказалось недостаточно
  103.             {
  104.                 continue;
  105.             }
  106.                    
  107.         }
  108.         else if(strlen(str1) > len); //Если в строке больше символов, чем нужно
  109.         {
  110.             ptr = str1 + len; //Указатель на начало лишних символов
  111.             strcpy(strost, ptr); //Копируем лишние символы в strost
  112.             str1[len] = '\0'; //Удаляем лишние символы из str1
  113.             strcat(strost, str2); //Добавляем в конец strost str2
  114.             strcpy(str2, strost); //Переносим остаток + прошлую str2 в str2
  115.         }
  116.  
  117.         str1[strlen(str1) + 1] = '\0';
  118.         str1[strlen(str1)] = '\n';
  119.         fputs(str1, out);
  120.         memset(str1, '\0', 1024);
  121.         memset(strost, '\0', 1024);
  122.         strcpy(str1, str2); //str2 становится str1, т.е. обрабатываемой строкой
  123.         memset(str2, '\0', 1024);
  124.     }
  125.     printf("Program executed successfully.\nCheck file for results.");
  126.     fclose(in);
  127.     fclose(out);
  128.     return 0;
  129. }
  130.  
  131. void replace_tabs(char *str, char *out) //Заменяем все символы табуляции на 3 пробела, удаляем '\n'
  132. {
  133.     char *ptr;
  134.     char *s = malloc(1024);
  135.     char end[1] = {0};
  136.     strcpy(s, str);
  137.    
  138.     memset(out, '\0', 1024);
  139.     while ((ptr = strchr(s, '\t')) != NULL) //Пока в строке есть '\t'
  140.     {
  141.         *ptr = '\0'; //Заменяем '\t' на '\0', это конец подстроки
  142.         strcat(out, s); //Копируем в out всё до символа табуляции
  143.         strcat(out, "   ");
  144.         s = ptr + 1; //Символ, следующий за символом табуляции - теперь начало строки
  145.     }
  146.  
  147.     strcat(out, s);
  148.     if (out[strlen(out) - 1] == '\n') //Удаление из строки \n
  149.     {
  150.         out[strlen(out) - 1] = '\0';
  151.     }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement