Некорректно работает замена слов в файле - 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");