Некорректно работает замена слов в файле - 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++)
    {
 
    }
}
Текст файла: prostoe fuuuuuu gogi prontf gogi; prosoe; prosto 'waqo Ошибка в функции poisk или я не правильно работаю с файлами. Очень прошу помочь! Заранее спасибо.
И как сделать так что бы программа учитывала пробел?
А нет иправил то что просил.
#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++)
    {
 
    }
}
Помогите с интером, что бы при перезаписи он выводил в файл с \n.

Решение задачи: «Некорректно работает замена слов в файле»

textual
Листинг программы
        int ent=fgetc(fin);
        if(ent=='\n') fprintf(fout, "\n");

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5