Оставить в файле только те фразы, которые содержат не менее трех - C (СИ)
Формулировка задачи:
Всем доброго времени суток. Нужна ваша помощь. Я написал программу под задачу: Дан файл, содержащий некоторый текст. Оставить в этом файле только те фразы, которые содержат не менее трех. Но она не правильно работает. Подскажите, пожалуйста, в чем проблема?
Код программы:
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <locale.h>
- int poisk(char *);
- int main(int argc, char *argv[])
- {setlocale(LC_ALL,"Rus");
- FILE *f1,*f2;
- char str[100],file[30];
- int len=0,c;
- if(argc==1)
- {
- printf("Введите путь к файлу:\n");
- gets(file);
- }
- else
- strcpy(file,argv[1]);
- if(((f1=fopen(file,"r"))==NULL))
- {
- perror("Ошибка открытия файла");
- system("pause");
- return 1;
- }
- if(((f2=fopen("output.txt","w"))==NULL))
- {
- perror("Ошибка открытия файла");
- system("pause");
- return 1;
- }
- do
- {
- c=fgetc(f1);
- if((c=='.')||(c==EOF))
- {
- *(str+len)= (c=='.')?'.':' ';
- *(str+len+1)='\0';
- if(poisk(str))
- fprintf(f2,"%s",str);
- len=0;
- }
- else
- {
- *(str+len)=c;
- len++;
- }
- }
- while(c!=EOF);
- fclose(f1);
- fclose(f2);
- system("pause");
- return 0;
- }
- int poisk(char *str)
- {
- char *istr,sep[]=" \n";
- int i,a=0;
- istr=strtok(str,sep);
- while(istr!=NULL)
- {
- for(i=0;*(istr+i)!=0;i++)
- if(*(istr+i)==' ' || *(istr+i)==',' || *(istr+i)==':' || *(istr+i)==';'||*(istr+i)=='-')
- a++;
- istr=strtok(NULL,sep);
- if(istr != NULL)
- *(istr-1)=' ';
- if(a<3)
- return 0;
- a=0;
- }
- return 1;
- }
Решение задачи: «Оставить в файле только те фразы, которые содержат не менее трех»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <locale.h>
- int poisk(char *);
- int main()
- {
- setlocale(LC_ALL,"Rus");
- FILE *f1,*f2;
- char str[100];
- int len=0;
- char c;
- if(((f1=fopen("С:\\file1.txt","r"))==NULL))
- {
- perror("Error opening file");
- return 1;
- }
- if(((f2=fopen("С:\\file2.txt","w"))==NULL))
- {
- perror("Error opening file");
- return 1;
- }
- do
- {
- c = fgetc(f1);
- if((c=='.')||(c==EOF))
- {
- *(str+len) = (c=='.')?'.':' ';
- *(str+len+1)='\0';
- if(poisk(str))
- fprintf(f2,"%s",str);
- len=0;
- }
- else
- {
- *(str+len)=c;
- len++;
- }
- }
- while(c!=EOF);
- fclose(f1);
- fclose(f2);
- return 0;
- }
- int poisk(char *str)
- {
- int i=0;
- int a=0;
- while(str[i]!='\0')
- {
- if((str[i]==' ')||(str[i]==',')||(str[i]==':')||(str[i]==';')||(str[i]=='-'))
- {
- a++;
- }
- i++;
- }
- if(a<3)
- return 0;
- a=0;
- return 1;
- }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяются функции main и poisk
- Устанавливается русская локаль
- Открываются файлы f1 и f2 для чтения и записи соответственно
- Переменная len инициализируется нулем, а переменная c получает значение от fgetc(f1)
- Если c - это точка или EOF, то выполняется блок кода:
- Если c - это точка, то в str добавляется точка, иначе пробел
- В str добавляется нулевой символ
- Вызывается функция poisk с аргументом str
- Если функция poisk вернула 1, то в f2 записывается содержимое str
- Переменная len обнуляется
- Если c - это не точка или EOF, то выполняется блок кода:
- В str добавляется значение c
- Переменная len увеличивается на единицу
- Цикл do-while выполняется до тех пор, пока c не станет равным EOF
- Файлы f1 и f2 закрываются
- Функция main возвращает 0, что означает успешное выполнение программы
- В функции poisk инициализируется переменная i нулем, а переменная a - нулем
- В цикле while выполняется проверка, пока str[i] не станет равным нулю:
- Если str[i] равен пробелу, запятой, двоеточию, точке с запятой или минусу, то переменная a увеличивается на единицу
- Переменная i увеличивается на единицу
- Если a меньше трех, то функция poisk возвращает 0
- Переменная a обнуляется, а функция poisk возвращает 1
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д