Удаление лишних пробелов в тексте - C (СИ)
Формулировка задачи:
программе задается имя входного текстового файла. программа должна осуществлять вывод на экран текста, содержащегося в заданном файле, заменяя несколько подряд идущих пробелов одним.
Прошу помогите, чем скорее, тем лучше.
заранее благодарен)
Решение задачи: «Удаление лишних пробелов в тексте»
textual
Листинг программы
#include <stdio.h> #include <malloc.h> int output_text(FILE* _out, const char* filename){ char* a, *b; long len; char* buf; FILE* fp = fopen(filename, "rb"); if(fp == NULL) return 0; fseek(fp, 0L, SEEK_END); if((len = ftell(fp)) <= 0L){ fclose(fp); return 0; } buf = (char*)malloc((size_t)len + sizeof(char)); if(buf == NULL){ fclose(fp); return 0; } fseek(fp, 0L, SEEK_SET); if((long)fread(buf, 1, (size_t)len, fp) != len){ free(buf); fclose(fp); return 0; } fclose(fp); buf[len] = '\0'; //удаление повторяющих пробелов for(a = b = buf; *a; *a = *++b){ if((*b == ' ' && *(b + 1) == ' ') || (*b == '\r' && *(b + 1) == '\n')) continue; ++a; } fputs(buf, stdout); free(buf); return 1; } int main(void){ char fn[] = "file.txt"; if(! output_text(stdout, fn)) puts("error!"); getchar(); return 0; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: iostream.h и malloc.h
- Определяется функция output_text, которая принимает два аргумента: файловый дескриптор, в который необходимо записать результат, и строку с именем файла.
- Внутри функции определяются следующие переменные:
- a и b - указатели на разные части строки, которые используются для обработки строки.
- len - переменная для хранения длины строки.
- buf - указатель на выделенную память, в которую будет загружена строка из файла.
- fp - файловый дескриптор, который используется для чтения из файла.
- Открывается файл с помощью функции fopen. Если файл не может быть открыт, функция возвращает 0.
- С помощью функции fseek перемещается указатель чтения в конец файла для определения его длины.
- Длина файла сохраняется в переменную len. Если файл пуст или не удалось получить его размер, функция закрывает файл и возвращает 0.
- Выделяется память под строку, которая будет содержать содержимое файла. Если память не может быть выделена, функция закрывает файл и возвращает 0.
- С помощью функции fseek перемещается указатель чтения в начало файла для чтения его содержимого.
- Содержимое файла считывается в выделенную память с помощью функции fread. Если что-то пошло не так (например, конец файла был достигнут до того, как удалось прочитать все данные), функция освобождает память, закрывает файл и возвращает 0.
- Файл закрывается с помощью функции fclose.
- В цикле удаляются повторяющиеся пробелы. Для этого два указателя (a и b) перемещаются по строке. Если b встречает пробел и следующий за ним символ также является пробелом или символом новой строки, он пропускается.
- Результат выводится на экран с помощью функции fputs.
- Выделенная память освобождается с помощью функции free.
- Функция возвращает 1.
- В функции main определяется имя файла, который будет обрабатываться.
- Вызывается функция output_text, передавая в нее указатель на стандартный вывод и имя файла.
- Если функция output_text вернула 0, выводится сообщение об ошибке.
- Программа ожидает нажатия любой клавиши, чтобы пользователь мог увидеть результат.
- Функция main возвращает 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д