Удаление лишних пробелов в тексте - 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.