Оставить в файле только те фразы, которые содержат не менее трех - 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