Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
- void replace_tabs(char *str, char *out);
- int main()
- {
- char str1[1024] = { 0 }, str2[1024] = { 0 };
- char str[1024] = { 0 };
- char *ptr;
- char strost[1024] = { 0 };
- int dif, max_length, len;
- FILE *in, *out;
- char err_msg[] = "An error has occured";
- in = fopen("C:\\test\\file.txt", "rt"); //Открываем исходный файл для чтения
- if (in == NULL) //Если не открылся
- {
- perror(err_msg);
- return -1;
- }
- out = fopen("C:\\test\\lab10output.txt", "wt"); //Открываем исходный файл для записи
- if (out == NULL) //Если не открылся
- {
- fclose(in);
- perror(err_msg);
- return -1;
- }
- fseek(in, 0, SEEK_END); // Переходим в конец файла
- if (ftell(in) == 0) // Если файл пустой
- {
- printf("The file is empty.");
- fclose(in);
- fclose(out);
- remove(out);
- return 0;
- }
- fseek(in, 0, SEEK_SET); // Возвращение указателя в начало файла
- max_length = -1;
- while (fgets(str1, 256, in) != NULL) //Поиск наибольшей строки
- {
- replace_tabs(str1, str); //Заменяем символы табуляции и удаляем '\n'
- len = strlen(str);
- if (len > max_length)
- max_length = len;
- }
- if (!feof)
- { //Если ошибка
- perror(err_msg);
- fclose(in);
- fclose(out);
- return -1;
- }
- else
- { //Если конец файла
- fseek(in, 0, SEEK_SET); //Возвращаемся в начало файла
- }
- len = max_length / 2; //Новая длина строк
- if (fgets(str1, 256, in) == NULL) //Точно не конец файла, т.к. он непустой
- {
- perror(err_msg);
- fclose(in);
- fclose(out);
- return -1;
- }
- replace_tabs(str1, str);
- strcpy(str1, str);
- while (1)
- {
- if (strlen(str1) < len) //Если в строке не хватает символов
- {
- if (fgets(str2, 256, in) != NULL) //Считать следующую строку
- {
- replace_tabs(str2, str);
- strcpy(str2, str);
- }
- else
- {
- if (feof) //Если конец файла
- {
- str1[strlen(str1)] = '\0';
- fputs(str1, out); //Записать неотформатированную строку str1
- break;
- }
- else //Если ошибка
- {
- perror(err_msg);
- fclose(in);
- fclose(out);
- return -1;
- }
- }
- dif = len - strlen(str1); //Кол-во недостающих символов
- strncat(str1, str2, dif); //Присоединяем dif символов из str2 к str1
- strcpy(strost, str2 + dif); //strost - неиспользованные символы str2
- strcpy(str2, strost); //Переносим остаток в str2
- if (strlen(str1) < len) //Если всех символов str2 оказалось недостаточно
- {
- continue;
- }
- }
- else if(strlen(str1) > len); //Если в строке больше символов, чем нужно
- {
- ptr = str1 + len; //Указатель на начало лишних символов
- strcpy(strost, ptr); //Копируем лишние символы в strost
- str1[len] = '\0'; //Удаляем лишние символы из str1
- strcat(strost, str2); //Добавляем в конец strost str2
- strcpy(str2, strost); //Переносим остаток + прошлую str2 в str2
- }
- str1[strlen(str1) + 1] = '\0';
- str1[strlen(str1)] = '\n';
- fputs(str1, out);
- memset(str1, '\0', 1024);
- memset(strost, '\0', 1024);
- strcpy(str1, str2); //str2 становится str1, т.е. обрабатываемой строкой
- memset(str2, '\0', 1024);
- }
- printf("Program executed successfully.\nCheck file for results.");
- fclose(in);
- fclose(out);
- return 0;
- }
- void replace_tabs(char *str, char *out) //Заменяем все символы табуляции на 3 пробела, удаляем '\n'
- {
- char *ptr;
- char *s = malloc(1024);
- char end[1] = {0};
- strcpy(s, str);
- memset(out, '\0', 1024);
- while ((ptr = strchr(s, '\t')) != NULL) //Пока в строке есть '\t'
- {
- *ptr = '\0'; //Заменяем '\t' на '\0', это конец подстроки
- strcat(out, s); //Копируем в out всё до символа табуляции
- strcat(out, " ");
- s = ptr + 1; //Символ, следующий за символом табуляции - теперь начало строки
- }
- strcat(out, s);
- if (out[strlen(out) - 1] == '\n') //Удаление из строки \n
- {
- out[strlen(out) - 1] = '\0';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement