Загрузка данных


#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;
}