Удалить из файла все однобуквенные слова и лишние пробелы - 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; }
Объяснение кода листинга программы
- Создается функция
s_format
, которая принимает на вход указатель на строку и возвращает указатель на новую строку. - В функции
s_format
происходит два прохода по входной строке:- На первом проходе удаляются все однобуквенные символы, которые не являются первой буквой слова.
- На втором проходе удаляются все лишние пробелы, которые идут подряд.
- В функции
file_format
открывается входной файл для чтения в бинарном режиме, определяется его размер, выделяется память под буфер, файл считывается в буфер, а затем открывается выходной файл для записи в бинарном режиме. - В цикле происходит перезапись выходного файла с использованием отформатированной строки из функции
s_format
. - После записи в выходной файл происходит его закрытие и проверка на успешность записи.
- В конце программы вызывается функция
file_format
с указателями на входной и выходной файлы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д