Копирование текста из файла с заменой слов

Необходимо в некотором тексте, в котором могут быть русские, английские символы и знаки препинания, заменить некоторые слова которые находятся во втором файле на слова из третьего файла(слова расположены на по одному на строке). С кодировкой ANSI работает, но как сделать и для UTF-8.

#include <stdlib.h>
#include <stdio.h>
#include <string.h >
#include <Windows.h>
#pragma warning(disable : 4996)
int count = 0;
char** read_words(FILE* file)//сохрание слов из файла в массив  
{ 
    char** Startwords = (char**)malloc(sizeof(char*));
    char** Startaddwords;
    char c;
    c = getc(file);
    if (!feof(file))
    {
        int count_words = 1;
        while (!feof(file))
        {
            char* Startstring = (char*)malloc(sizeof(char));
            char* Startaddstring;
            int len = 1;
            while (1)
            {
                Startstring[len - 1] = c;
                c = getc(file);
                if ((c == '\n') | (c == EOF))
                {
                    Startstring[len] = '\0';
                    if (c == '\n') c = getc(file);
                    break;
                }
                else len++;
                Startaddstring = (char*)realloc(Startstring, len * sizeof(char));
                if (Startaddstring != NULL) Startstring = Startaddstring;
            }
            Startwords[count_words - 1] = Startstring;
            if (feof(file)) break;
            else
            {
                count_words++;
                Startaddwords = (char**)realloc(Startwords, (count_words) * sizeof(char*));
                if (Startaddwords != NULL) Startwords = Startaddwords;
            }
        }
        if (count == 0) count = count_words;
    }
    return Startwords;
}
void Words(FILE* start, FILE* Swords, FILE* Ewords, FILE* end)
{
    char** a,** b;
    a = read_words(Swords);
    b = read_words(Ewords);
    unsigned char c;
    c = getc(start);
    while (!feof(start))
    {
        if (((c > 64) & (c < 91)) | ((c > 96) & (c < 123)) | ((c > 191) & (c<256)) | (c==184) | (c==168))
        {
            char* word = (char*)malloc(sizeof(char));
            char* addword;
            int len = 1;
            word[len - 1] = c;
            c = getc(start);
            while (((c > 64) & (c < 91)) | ((c > 96) & (c < 123)) | ((c > 191) & (c < 256)) | (c == 184) | (c == 168))
            {
                len++;
                addword = (char*)realloc(word, len * sizeof(char));
                if (addword != NULL) word = addword;
                word[len - 1] = c;
                c = getc(start);
            }
            word[len] = '\0';
            int F = 0;
            for (int i = 0; i< count; i++)
            {
                if (strcmp(word, a[i]) == 0)
                {
                    fputs(b[i], end);
                    F = 1;
                    break;
                }
            }
            if (F==0) fputs(word, end);
            putc(c, end);
        }
        else putc(c, end);
        c = getc(start);
    }
}
int main(int argc, char** argv)
{
   FILE* start, * start_words, * end_words, * end;//стартовый|заменяемые слова|заменяющие слова|конечный
   start = NULL;
   start_words = NULL;
   end_words = NULL;
   end = NULL;
   for (int i = 1; i < argc; i++)
    {
        const char* name = argv[i];
        if (i == 1) start = fopen(name, "r");
        if (i == 2) start_words = fopen(name, "r");
        if (i == 3) end_words = fopen(name, "r");
        if (i == 4) end = fopen(name, "w");
    }
   Words(start, start_words, end_words, end);
   fclose(start);
   fclose(start_words);
   fclose(end_words);
   fclose(end);
   return 0;
}
}```

Ответы (0 шт):