Копирование текста из файла с заменой слов
Необходимо в некотором тексте, в котором могут быть русские, английские символы и знаки препинания, заменить некоторые слова которые находятся во втором файле на слова из третьего файла(слова расположены на по одному на строке). С кодировкой 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;
}
}```