Некорректно работает замена слов в файле - C (СИ)
Формулировка задачи:
#include <string.h> #include <conio.h> #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <io.h> #include <locale.h> #define WORD_SIZE 256 #define WORD_MASK "%255s" #define INS_COST 1 #define DEL_COST 1 #define SUB_COST 1 #define TEST(EXPR) \ printf(#EXPR ": %u\n", EXPR) size_t min3(size_t a, size_t b, size_t c) { return a < b ? (a < c ? a : c) : (b < c ? b : c); } size_t levenshtein_distance(const char *s1, const char *s2) { size_t len1 = strlen(s1), len2 = strlen(s2); size_t **dist_mat; size_t i, j; size_t ans; dist_mat = malloc((len1 + 1) * sizeof(size_t*)); for(i = 0; i <= len1; ++i) dist_mat[i] = malloc((len2 + 1) * sizeof(size_t)); dist_mat[0][0] = 0; for(j = 1; j <= len2; ++j) dist_mat[0][j] = j * INS_COST; for(i = 1; i <= len1; ++i) { dist_mat[i][0] = i * DEL_COST; for(j = 1; j <= len2; ++j) { if(s1[i - 1] == s2[j - 1]) dist_mat[i][j] = dist_mat[i - 1][j - 1]; else dist_mat[i][j] = min3(dist_mat[i - 1][j] + DEL_COST, dist_mat[i][j - 1] + INS_COST, dist_mat[i - 1][j - 1] + SUB_COST); } } ans = dist_mat[len1][len2]; for(i = 0; i <= len1; ++i) free(dist_mat[i]); free(dist_mat); return ans; } char deleteoper(char *x, char *y, char *s1, char *s2) { FILE * fin, * fout; size_t cnt; char wordToRemove[WORD_SIZE], wordToInsert[WORD_SIZE], currentWord[WORD_SIZE]; if ( ! ( fin = fopen(x, "r") ) ) { fprintf(stderr, "Невозможно открыть файл входящий!\n", x); exit(1); } if ( ! ( fout = fopen(y, "w") ) ) { fprintf(stderr, "Невозможно открыть файл выходящий!\n", y); exit(1); } /* printf("Слово для удаление: "); scanf(WORD_MASK, wordToRemove); printf("Слово для добавления: "); scanf(WORD_MASK, wordToInsert); */ cnt = 0; while ( fscanf(fin, WORD_MASK, currentWord) == 1 ) { if ( fprintf(fout, "%s ", ( strcmp(currentWord, s1) == 0 && ++cnt ) ? s2 : currentWord) < 1 ) { fprintf(stderr, "Невозможно начать запись!\n"); exit(1); } int ent=fgetc(fin); if(ent=='\n') fprintf(fout, "\n"); } if ( ferror(fin) ) { fprintf(stderr, "Невозможно прочитать файл!\n"); exit(1); } fclose(fin); fclose(fout); printf("%u изменений\n", cnt); return(1); } void poisk(char *x, char *y) { FILE * fin; char symbol; char slovo[800]; char *etalon[3]={"scanf", "gogi", "pr"}; int i=0; int j=0; int k=0; if ( ! ( fin = fopen(x, "r") ) ) { fprintf(stderr, "Невозможно открыть файл входящий!\n", x); exit(1); } while((symbol=fgetc(fin))!=EOF) { if(k!=0) break; if(symbol!=' ' && i < 799) { slovo[i]=symbol; i++; } else{slovo[i]='\0'; i=0; for(j=0;j<3;j++) { if(levenshtein_distance(slovo, etalon[j])<4){ deleteoper(x,y,slovo,etalon[j]); k=1; break; } } } } slovo[i]='\0'; fclose(fin); free(slovo); } int main(void) { setlocale(LC_ALL,""); FILE*fp; FILE*fl; char vyvod[60],oper[20],simv; char *put=(char*)malloc(60); char *output=(char*)malloc(60); int vybor=0,v=0,n=0; while(1){ printf("\n1. Ввести путь к файлу\n"); printf("2. Поиск и исправление ошибок(пошаговое), и в отдельный файл(РЕКОМЕНДУЕТСЯ)\n"); printf("3. Поиск и исправление ошибок(пошаговое), и сохранение в этот же файл\n"); printf("4. Выход\n \n"); scanf("%i",&vybor); switch(vybor){ case 1: { printf("\nВведите путь к файлу: "); scanf("%59s",put); v=2; break; }; case 2: { system("cls"); if(v==2){ printf("\nВведите название файл в который хотите записать: "); scanf( "%59s",output); poisk(put,output); printf("%s\n",put); } else { printf("\nНе ведён путь к файлу, введите его"); } break; }; case 3: {if(v==2){ printf("%s\n",put);} else { printf("\nНе ведён путь к файлу, введите его"); } break; }; case 4: { v=1; break; }; } if(v==1) { break; } } } char func(char *x) { FILE *fp; int i; if((fp=fopen(x,"r"))==NULL) { puts("\nНевозможно открыть файл\n"); } for(i=0;i<=10;i++) { } }
И как сделать так что бы программа учитывала пробел?
А нет иправил то что просил.
#include <string.h> #include <conio.h> #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <io.h> #include <locale.h> #define WORD_SIZE 256 #define WORD_MASK "%255s" #define INS_COST 1 #define DEL_COST 1 #define SUB_COST 1 #define TEST(EXPR) \ printf(#EXPR ": %u\n", EXPR) size_t min3(size_t a, size_t b, size_t c) { return a < b ? (a < c ? a : c) : (b < c ? b : c); } size_t levenshtein_distance(const char *s1, const char *s2) { size_t len1 = strlen(s1), len2 = strlen(s2); size_t **dist_mat; size_t i, j; size_t ans; dist_mat = malloc((len1 + 1) * sizeof(size_t*)); for(i = 0; i <= len1; ++i) dist_mat[i] = malloc((len2 + 1) * sizeof(size_t)); dist_mat[0][0] = 0; for(j = 1; j <= len2; ++j) dist_mat[0][j] = j * INS_COST; for(i = 1; i <= len1; ++i) { dist_mat[i][0] = i * DEL_COST; for(j = 1; j <= len2; ++j) { if(s1[i - 1] == s2[j - 1]) dist_mat[i][j] = dist_mat[i - 1][j - 1]; else dist_mat[i][j] = min3(dist_mat[i - 1][j] + DEL_COST, dist_mat[i][j - 1] + INS_COST, dist_mat[i - 1][j - 1] + SUB_COST); } } ans = dist_mat[len1][len2]; for(i = 0; i <= len1; ++i) free(dist_mat[i]); free(dist_mat); return ans; } char deleteoper(char *x, char *y, char *s1, char *s2) { FILE * fin, * fout; size_t cnt; char wordToRemove[WORD_SIZE], wordToInsert[WORD_SIZE], currentWord[WORD_SIZE]; if ( ! ( fin = fopen(x, "r") ) ) { fprintf(stderr, "Невозможно открыть файл входящий!\n", x); exit(1); } if ( ! ( fout = fopen(y, "w") ) ) { fprintf(stderr, "Невозможно открыть файл выходящий!\n", y); exit(1); } /* printf("Слово для удаление: "); scanf(WORD_MASK, wordToRemove); printf("Слово для добавления: "); scanf(WORD_MASK, wordToInsert); */ cnt = 0; while ( fscanf(fin, WORD_MASK, currentWord) == 1 ) { if ( fprintf(fout, "%s ", ( strcmp(currentWord, s1) == 0 && ++cnt ) ? s2 : currentWord) < 1 ) { fprintf(stderr, "Невозможно начать запись!\n"); exit(1); } int ent=fgetc(fin); if(ent=='\n') fprintf(fout, "\n"); } if ( ferror(fin) ) { fprintf(stderr, "Невозможно прочитать файл!\n"); exit(1); } fclose(fin); fclose(fout); printf("%u изменений\n", cnt); return(1); } void poisk(char *x, char *y) { FILE * fin; char symbol; char slovo[800]; char *etalon[3]={"scaniuf", "gogi", "pujijoi;jr"}; int i=0; int j=0; int k=0; if ( ! ( fin = fopen(x, "r") ) ) { fprintf(stderr, "Невозможно открыть файл входящий!\n", x); exit(1); } while((symbol=fgetc(fin))!=EOF) { printf("%i\n",k); if(k!=0) break; if(symbol!=' ' && i < 799) { slovo[i]=symbol; i++; } else{slovo[i]='\0'; i=0; for(j=0;j<3;j++) { TEST(levenshtein_distance(slovo, etalon[j])); if(levenshtein_distance(slovo, etalon[j])<4 && levenshtein_distance(slovo, etalon[j])!=0){ deleteoper(x,y,slovo,etalon[j]); k=1; break; } } } } slovo[i]='\0'; fclose(fin); free(slovo); } int main(void) { setlocale(LC_ALL,""); FILE*fp; FILE*fl; char vyvod[60],oper[20],simv; char *put=(char*)malloc(60); char *output=(char*)malloc(60); int vybor=0,v=0,n=0; while(1){ printf("\n1. Ввести путь к файлу\n"); printf("2. Поиск и исправление ошибок(пошаговое), и в отдельный файл(РЕКОМЕНДУЕТСЯ)\n"); printf("3. Поиск и исправление ошибок(пошаговое), и сохранение в этот же файл\n"); printf("4. Выход\n \n"); scanf("%i",&vybor); switch(vybor){ case 1: { printf("\nВведите путь к файлу: "); scanf("%59s",put); v=2; break; }; case 2: { system("cls"); if(v==2){ printf("\nВведите название файл в который хотите записать: "); scanf( "%59s",output); poisk(put,output); printf("%s\n",put); } else { printf("\nНе ведён путь к файлу, введите его"); } break; }; case 3: {if(v==2){ printf("%s\n",put);} else { printf("\nНе ведён путь к файлу, введите его"); } break; }; case 4: { v=1; break; }; } if(v==1) { break; } } } char func(char *x) { FILE *fp; int i; if((fp=fopen(x,"r"))==NULL) { puts("\nНевозможно открыть файл\n"); } for(i=0;i<=10;i++) { } }
Решение задачи: «Некорректно работает замена слов в файле»
textual
Листинг программы
int ent=fgetc(fin); if(ent=='\n') fprintf(fout, "\n");
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д