Удалить из файла все однобуквенные слова и лишние пробелы - 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с указателями на входной и выходной файлы.