Удалить одинаковые слова из файлов - C (СИ)
Формулировка задачи:
Такая вот задача. Есть два текстовых файла со словами, разделенными пробелами. Надо проверить, есть ли одинаковые слова в этих файлах и, если таковые найдены, удалить их из обоих файлов. Дополнительных массивов не использовать.
Написать программу надо на простом С. Проблема у меня с самим удалением слов из файлов. Вот что у меня есть.
#include <stdio.h>
#include <string.h>
void main(){
FILE *f1,*f2;
char s1,*str1,*str2,*res1,*res2;
char line1[256],line2[256];
clrscr();
f1=fopen("1.txt","wt");
if (f1==0)
printf("Oshibka chteniya!");
else{
printf("Vvedite text 1:");
gets(s1);
fprintf(f1,"%s",s1);
} fclose(f1);
f2=fopen("2.txt","wt");
if (f2==0)
printf("Oshibka chteniya!!");
else{
printf("Vvedite text 2:");
gets(s1);
fprintf(f2,"%s",s1);
} fclose(f2);
f1=fopen("1.txt","rt");
f2=fopen("2.txt","rt");
fgets(line1,256,f1);
fgets(line2,256,f2);
res1=strtok(line1," ");
while(res1!=NULL){
if(strstr(line2,res1)!=NULL)
/*и вот тут-то у меня затык*/
res1=strtok(NULL," ");
}
fclose(f1);
fclose(f2);
getch();
}Решение задачи: «Удалить одинаковые слова из файлов»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
FILE *f1,*f2,*f3,*f4,*f5;
char *tok1,*tok2;
int z=0;
char strf1[256],strf2[256];
int j;
clrscr();
f1=fopen("1.txt","wt");
fputs("some text file\n",f1);
fputs("blabla qwerty",f1);
f2=fopen("2.txt","wt");
fputs("qwerty asdfg\n",f2);
fputs("some text file",f2);
fcloseall();
f1=fopen("1.txt","rt");
f2=fopen("2.txt","rt");
f3=fopen("3.txt","wt");
fputs("There are such words in file 1 that are not in file 2:\n",f3);
f4=fopen("4.txt","wt");
fputs("There are such words in file 2 that are not in file 1:\n",f4);
f5=fopen("5.txt","wt");
fputs("There are such words in both files:\n",f5);
while(fgets(strf1,256,f1))
{
++z;
printf("\nCycle %d, stringF1 %s\n",z,strf1);
tok1=strtok(strf1," ");
while(tok1!=NULL)
{
f2=fopen("2.txt","rt");
while(fgets(strf2,256,f2))
{
printf("\nMiniCycle %d, stringF2 %s\n",z,strf2);
if(strstr(strf2,tok1)==NULL)
;
else
{
tok2=strstr(strf2,tok1);
printf("Ptr comparsion strf2: %s\n",tok2);
if(tok2!=NULL)
{
tok2=strtok(tok2," ");
printf("Tok1 base: %s, Tok2 base: %s\n",tok1,tok2);
while(tok2!=NULL)
{
if(strlen(tok1)==strlen(tok2))
{ j=0;
printf("Length the same %s, %s, %d, %d\n",tok1,tok2,strlen(tok1),strlen(tok2));
for(unsigned int i=0;i<strlen(tok1);++i)
{
if(tok1[i]!=tok2[i])
++j;
fputs(tok2,f3);
}
if(j==0)
{
printf("------!!!Parts tok1 and tok2 are the same!!! %s, %s------\n",tok1,tok2);
fputs(tok2,f5);
fputs("\n",f5);
}
}
tok2=strtok(NULL," ");
}
}
}
}
printf("end of comparing %s\n",tok1);
tok1=strtok(NULL," ");
fclose(f2);
}
}
fcloseall();
getch();
}
Объяснение кода листинга программы
В этом коде происходит сравнение двух текстовых файлов на наличие одинаковых слов. Вот список действий, которые происходят в коде:
- Файлы 1 и 2 открываются для чтения, а файлы 3, 4 и 5 - для записи.
- В цикле, пока есть строки в файле 1, каждая строка обрабатывается следующим образом:
- Строка разбивается на слова и сохраняется первое слово в переменной
tok1. - Во внутреннем цикле, пока есть строки в файле 2, каждая строка проверяется на наличие слова
tok1. Если слово найдено, выполняется следующая последовательность действий:- Слово
tok2из файла 2 сохраняется в переменнойtok2. - Проверяется, являются ли слова
tok1иtok2одинаковыми. Если они одинаковые, то в файл 3 записывается словоtok2. - Если слова не одинаковые, то проверяется, являются ли они похожими (длина слов одинаковая). Если да, то в файл 3 записывается слово
tok2. - Если слова не одинаковые и не похожи, то в файл 5 записывается слово
tok2.
- Слово
- Строка разбивается на слова и сохраняется первое слово в переменной
- После обработки всех строк из файла 1, все файлы закрываются.
- Программа ожидает нажатия клавиши для завершения работы.