Advertisement
CherMi

Lab 10 pre-final version

Oct 24th, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.67 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.         return 0;
  35.     }
  36.     fseek(in, 0, SEEK_SET); // Возвращение указателя в начало файла
  37.     max_length = -1;
  38.     while (fgets(str1, 256, in) != NULL) //Поиск наибольшей строки
  39.     {
  40.         replace_tabs(str1, str); //Заменяем символы табуляции и удаляем '\n'
  41.         len = strlen(str);
  42.         if (len > max_length)
  43.             max_length = len;
  44.     }
  45.     if (!feof)
  46.     { //Если ошибка
  47.         perror(err_msg);
  48.         return -1;
  49.     }
  50.     else
  51.     { //Если конец файла
  52.         fseek(in, 0, SEEK_SET); //Возвращаемся в начало файла
  53.     }
  54.  
  55.     //TODO: добавить проверки на открытие файлов
  56.     fgets(str1, 256, in); //TODO: Добавить проверку на NULL
  57.     replace_tabs(str1, str);
  58.     strcpy(str1, str);
  59.     while (1)
  60.     {
  61.         len = max_length / 2; //Новая длина строк
  62.         if (strlen(str1) < len) //Если в строке не хватает символов
  63.         {
  64.             if (fgets(str2, 256, in) != NULL) //Считать следующую строку
  65.             {
  66.                 replace_tabs(str2, str);
  67.                 strcpy(str2, str);
  68.             }
  69.             else
  70.             {
  71.                 if (feof) //Если конец файла
  72.                 {
  73.                     str1[strlen(str1)] = '\0';
  74.                     fputs(str1, out); //Записать неотформатированную строку str1
  75.                     break;
  76.                 }
  77.                 else //Если ошибка
  78.                 {
  79.                     perror(err_msg);
  80.                     return -1;
  81.                 }
  82.             }
  83.             dif = len - strlen(str1); //Кол-во недостающих символов
  84.             strncat(str1, str2, dif); //Присоединяем dif символов из str2 к str1
  85.             strcpy(strost, str2 + dif); //strost - неиспользованные символы str2
  86.             strcpy(str2, strost); //Переносим остаток + прошлую str2 в str2
  87.  
  88.             if (strlen(str1) < len) //Если всех символов str2 оказалось недостаточно
  89.             {
  90.                 continue;
  91.             }
  92.                    
  93.         }
  94.         else if(strlen(str1) > len); //Если в строке больше символов, чем нужно
  95.         {
  96.             ptr = str1 + len; //Указатель на начало лишних символов
  97.             strcpy(strost, ptr); //Копируем лишние символы в strost
  98.             str1[len] = '\0'; //Удаляем лишние символы из str1
  99.             strcat(strost, str2); //Добавляем в конец strost str2
  100.             strcpy(str2, strost); //Переносим остаток + прошлую str2 в str2
  101.         }
  102.  
  103.         str1[strlen(str1) + 1] = '\0';
  104.         str1[strlen(str1)] = '\n';
  105.         fputs(str1, out);
  106.         memset(str1, '\0', 1024);
  107.         memset(strost, '\0', 1024);
  108.         strcpy(str1, str2); //str2 становится str1, т.е. обрабатываемой строкой
  109.         memset(str2, '\0', 1024);
  110.     }
  111.     printf("Program executed successfully.\nCheck file for results.");
  112.     return 0;
  113.     fclose(in);
  114.     fclose(out);
  115.     return 0;
  116. }
  117.  
  118. void replace_tabs(char *str, char *out) //Заменяем все символы табуляции на 3 пробела, удаляем '\n'
  119. {
  120.     char c;
  121.     char *ptr;
  122.     char *tmp = malloc(1024);
  123.     char *s = malloc(1024);
  124.     char end[1] = {0};
  125.     strcpy(s, str);
  126.     int i, j; //i - счётчик по входной строке, j - по результирующей
  127.    
  128.     memset(out, '\0', 1024);
  129.     while ((ptr = strchr(s, '\t')) != NULL) //Пока в строке есть '\t'
  130.     {
  131.         *ptr = '\0'; //Заменяем '\t' на '\0', это конец подстроки
  132.         strcat(out, s); //Копируем в out всё до символа табуляции
  133.         strcat(out, "   ");
  134.         s = ptr + 1; //Символ, следующий за символом табуляции - теперь начало строки
  135.     }
  136.  
  137.     strcat(out, s);
  138.     if (out[strlen(out) - 1] == '\n')
  139.     {
  140.         out[strlen(out) - 1] = '\0';
  141.     }
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement