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