Загрузка данных
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <wchar.h> // Для работы с wchar_t
#include <wctype.h> // Для iswalpha и towlower
#include <locale.h>
#define MAX_LINE 1024
#define MAX_PATH_LEN 512
/* Проверка, является ли широкий символ гласной буквой */
int is_vowel_w(wchar_t ch)
{
wchar_t c = towlower(ch);
// Латинские и русские гласные в Unicode
if (c == L'a' || c == L'e' || c == L'i' || c == L'o' || c == L'u' || c == L'y' ||
c == L'а' || c == L'е' || c == L'ё' || c == L'и' || c == L'о' ||
c == L'у' || c == L'ы' || c == L'э' || c == L'ю' || c == L'я')
{
return 1;
}
return 0;
}
/* Преобразование одного слова из широких символов */
void transform_word_w(wchar_t* word, int len)
{
wchar_t tmp[MAX_LINE];
int v_pos = 0;
int c_pos;
if (len <= 0 || len >= MAX_LINE)
return;
// Сначала собираем гласные
for (int i = 0; i < len; ++i) {
if (is_vowel_w(word[i])) {
tmp[v_pos++] = word[i];
}
}
// Затем все остальные символы слова (согласные, цифры)
c_pos = v_pos;
for (int i = 0; i < len; ++i) {
if (!is_vowel_w(word[i])) {
tmp[c_pos++] = word[i];
}
}
// Копируем обратно в исходное слово
for (int i = 0; i < len; ++i) {
word[i] = tmp[i];
}
}
/* Чтение строки из UTF-8 файла */
int input_line_w(wchar_t* buf, int size, FILE* f)
{
if (!fgetws(buf, size, f)) {
return 0;
}
size_t len = wcslen(buf);
if (len > 0 && buf[len - 1] == L'\n') {
buf[len - 1] = L'\0';
return 1;
}
wint_t ch;
while ((ch = fgetwc(f)) != L'\n' && ch != WEOF) {}
return 1;
}
/* Ввод пути к файлу */
void input_path_w(wchar_t* path, int size)
{
wprintf(L"Введите путь к входному файлу: ");
if (!fgetws(path, size, stdin)) {
wprintf(L"Ошибка ввода пути.\n");
path[0] = L'\0';
return;
}
size_t len = wcslen(path);
if (len > 0 && path[len - 1] == L'\n') {
path[len - 1] = L'\0';
}
}
int main(void)
{
// Настраиваем консоль и файловые потоки на работу с универсальной UTF-8
setlocale(LC_ALL, ".UTF8");
wchar_t path[MAX_PATH_LEN];
FILE* infile;
wchar_t line[MAX_LINE];
wprintf(L"Программа читает текст из файла и в каждом слове\n");
wprintf(L"перемещает гласные буквы в начало слова, а остальные символы в конец.\n\n");
input_path_w(path, sizeof(path) / sizeof(wchar_t));
if (path[0] == L'\0') {
wprintf(L"Путь к файлу не задан.\n");
return 1;
}
infile = _wfopen(path, L"r, ccs=UTF-8"); // Явно указываем, что файл в кодировке UTF-8
if (!infile) {
wprintf(L"Не удалось открыть файл: %s\n", path);
return 1;
}
wprintf(L"\nПреобразованный текст:\n\n");
while (input_line_w(line, sizeof(line) / sizeof(wchar_t), infile)) {
int i = 0;
int start = -1;
while (line[i] != L'\0') {
wchar_t ch = line[i];
// iswalpha проверяет любые буквы (и русские, и английские),
// а iswdigit — цифры
if (iswalpha(ch) || iswdigit(ch)) {
if (start == -1) {
start = i;
}
}
else {
if (start != -1) {
int end = i;
int len = end - start;
transform_word_w(&line[start], len);
start = -1;
}
}
++i;
}
if (start != -1) {
int end = i;
int len = end - start;
transform_word_w(&line[start], len);
}
wprintf(L"%s\n", line);
}
fclose(infile);
wprintf(L"\nОбработка завершена. Нажмите Enter для выхода...\n");
// Очистка буфера клавиатуры перед выходом
wint_t ch;
while ((ch = getwchar()) != L'\n' && ch != WEOF) {}
getwchar();
return 0;
}