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

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы: iostream.h и malloc.h
  2. Определяется функция output_text, которая принимает два аргумента: файловый дескриптор, в который необходимо записать результат, и строку с именем файла.
  3. Внутри функции определяются следующие переменные:
    • a и b - указатели на разные части строки, которые используются для обработки строки.
    • len - переменная для хранения длины строки.
    • buf - указатель на выделенную память, в которую будет загружена строка из файла.
    • fp - файловый дескриптор, который используется для чтения из файла.
  4. Открывается файл с помощью функции fopen. Если файл не может быть открыт, функция возвращает 0.
  5. С помощью функции fseek перемещается указатель чтения в конец файла для определения его длины.
  6. Длина файла сохраняется в переменную len. Если файл пуст или не удалось получить его размер, функция закрывает файл и возвращает 0.
  7. Выделяется память под строку, которая будет содержать содержимое файла. Если память не может быть выделена, функция закрывает файл и возвращает 0.
  8. С помощью функции fseek перемещается указатель чтения в начало файла для чтения его содержимого.
  9. Содержимое файла считывается в выделенную память с помощью функции fread. Если что-то пошло не так (например, конец файла был достигнут до того, как удалось прочитать все данные), функция освобождает память, закрывает файл и возвращает 0.
  10. Файл закрывается с помощью функции fclose.
  11. В цикле удаляются повторяющиеся пробелы. Для этого два указателя (a и b) перемещаются по строке. Если b встречает пробел и следующий за ним символ также является пробелом или символом новой строки, он пропускается.
  12. Результат выводится на экран с помощью функции fputs.
  13. Выделенная память освобождается с помощью функции free.
  14. Функция возвращает 1.
  15. В функции main определяется имя файла, который будет обрабатываться.
  16. Вызывается функция output_text, передавая в нее указатель на стандартный вывод и имя файла.
  17. Если функция output_text вернула 0, выводится сообщение об ошибке.
  18. Программа ожидает нажатия любой клавиши, чтобы пользователь мог увидеть результат.
  19. Функция main возвращает 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы