Удалить из файла все однобуквенные слова и лишние пробелы - C (СИ) (149535)

Узнай цену своей работы

Формулировка задачи:

Дан символьный файл f. Группы символов, разделенные пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Удалить из файла все однобуквенные слова и лишние пробелы. Результат записать в файл g

Решение задачи: «Удалить из файла все однобуквенные слова и лишние пробелы»

textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
#include <malloc.h>
char* s_format(char* s);
int   file_format(const char* _output, const char* _input);
 
int main(void){
    char _input[]  = "f.txt";
    char _output[] = "g.txt";
    if(! file_format(_output, _input))
        puts("error!");
    return 0;
}
 
int file_format(const char* _output, const char* _input){
    long   num;
    char*  buf, *p;
    size_t len;
    FILE*  fin, *fout;
 
    if((fin = fopen(_input, "rb")) == NULL)
        return 0;
 
    fseek(fin, 0L, SEEK_END);
    if((num = ftell(fin)) <= 0L){
        fclose(fin);
        return 0;
    }
 
    buf = (char*)malloc((size_t)(num + 1) * sizeof(char));
    if(buf == NULL){
        fclose(fin);
        return 0;
    }
    fseek(fin, 0L, SEEK_SET);
 
    len = fread(buf, sizeof(char), (size_t)num, fin);
    fclose(fin);
    if(len != (size_t)num){
        free(buf);
        return 0;
    }
 
    if((fout = fopen(_output, "wb")) == NULL){
        free(buf);
        return 0;
    }
    buf[len] = '\0';
 
    p   = s_format(buf);
    num = (long)(p - buf);
    len = fwrite(buf, sizeof(char), (size_t)num, fout);
    num = (len != (size_t)num) ? 0L : 1L;
 
    fflush(fout);
    fclose(fout);
    return (num == 1L);
}
 
char* s_format(char* s){
    char* a, *b, *p;
    //удаление однобуквенных символов
    for(a = b = s; *a; *a = *b){
        if(isalpha(*b)){
            if(! isalpha(*(b + 1)))
                ++b;
            else {
                while(*b && isalpha(*b))
                    *a++ = *b++;
            }
            continue;
        }
        ++a;
        ++b;
    }
 
    //удаление лишних пробелов
    for(a = b = s; *a; *a = *b){
        if(*b == ' '){
            p = b;
            while(*p == ' ')
                ++p;
            if((p - b) > 1){
                *a++ = *b;
                b    = p;
                continue;
            }
        }
        ++a;
        ++b;
    }
    return a;
}

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

  1. Создается функция s_format, которая принимает на вход указатель на строку и возвращает указатель на новую строку.
  2. В функции s_format происходит два прохода по входной строке:
    • На первом проходе удаляются все однобуквенные символы, которые не являются первой буквой слова.
    • На втором проходе удаляются все лишние пробелы, которые идут подряд.
  3. В функции file_format открывается входной файл для чтения в бинарном режиме, определяется его размер, выделяется память под буфер, файл считывается в буфер, а затем открывается выходной файл для записи в бинарном режиме.
  4. В цикле происходит перезапись выходного файла с использованием отформатированной строки из функции s_format.
  5. После записи в выходной файл происходит его закрытие и проверка на успешность записи.
  6. В конце программы вызывается функция file_format с указателями на входной и выходной файлы.

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


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

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

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