При считывании из файла "я" == EOF?

Задание такое: посчитать количество повторений букв в текстовом файле на украинском языке. Написал функцию, но что-то идёт не так, совсем запутался, не понимаю, в чём дело. Например, в файле записано имя "Петрова Настя". Количество повторений символа "я" равно 0. Возможно, "я" с кодом -1 в ANSI принимается программой как EOF. Помогите, пожалуйста, а то голову ломаю, впервые работаю с файлами в си((

char alphabetlow[MAX] = {'а', 'б', 'в', 'г', 'ґ', 'д', 'е', 'є', 'ж', 'з', 'и', 'і', 'ї', 'й', 
'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ю', 'я' };
char alphabetup[MAX] = {'А', 'Б', 'В', 'Г', 'Ґ', 'Д', 'Е', 'Є', 'Ж', 'З', 'И', 'І', 'Ї', 'Й',
'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ю', 'Я' };
char checked[MAX]; // уже перевірені літери
int numbers[MAX]; // кількість повторень відповідних за індексом літер

void AverageProbability(FILE* file) 
{
    int i;
    int j;
    int m = 0; // кількість літер у файлі (без повторень)
    int n = 0; // загальна кількість літер
    int all = 0; // загальна кількість символів
    int repeat = 0;
    int comp;
    int c;
    while ((c = fgetc(file)) != EOF) {
        int issymb = 0;
        int count = 1; // кількість повторень певної літери
        for (i = 0; i < MAX; i++) {
            if ((char)c == (char)alphabetup[i] || (char)c == (char)alphabetlow[i]) {
                issymb = 1;
                break;
            }
        }
        if (issymb == 1) {
            for (j = 0; j < MAX; j++) {
                if (alphabetlow[i] == checked[j]) {
                    repeat = 1;
                    break;
                }
            }
            if (repeat == 0) {
                checked[m] = alphabetlow[i];
                while ((comp = fgetc(file)) != EOF) {
                    if ((char)comp == (char)alphabetlow[i] || (char)comp == (char)alphabetup[i]) {
                        count++;
                    }
                }
                numbers[i] = count;
                m++;
            }
            n++;
        }
        all++;
        fseek(file, all, SEEK_SET);
    }
    printf(" К-сть букв - %d\n", n);
    for (i = 0; i < MAX; i++) {
        printf(" Буква [%c] - %d\n", alphabetlow[i], numbers[i]);
    }
}

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

Автор решения: Harry
char c;
while ((c = fgetc(file)) != EOF) {

А правильно -

int c;
while ((c = fgetc(file)) != EOF) {

Не уверен, впрочем, что это все неприятности.

Попробуйте этот код (только не забывайте, что файл должен быть в соответствующей кодировке):

#include <string.h>
#include <stdio.h>

const char * alphabetlow = {"абвгґдеєжзиіїйклмнопрстуфхцчшщьюя" };
const char * alphabetup  = {"АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ" };

unsigned char isUkrUp(char c)
{
    if (strchr(alphabetup,c)) return c;
    char * a = strchr(alphabetlow,c);
    if (a == NULL) return 0;
    return alphabetup[a-alphabetlow];
}

void AverageProbability(FILE* file)
{

    int total = 0;
    int count[256] = {0}; // Объем небольшой, а возни куда меньше :)
    for(int ch = fgetc(file); ch != EOF; ch = fgetc(file))
    {
        unsigned char c = isUkrUp((char)ch);
        if (c == 0) continue;
        total++;
        count[c]++;
    }
    printf(" К-сть букв - %d\n", total);
    for(const unsigned char * a =
        (const unsigned char *)alphabetup; *a; ++a)
    {
        printf(" Буква [%c] - %d\n", *a, count[*a]);
    }
}

int main()
{
    FILE* f = fopen("data","rt");
    AverageProbability(f);
    fclose(f);
}

Теоретически, если правильно работает локализация, то можно и еще проще, но...

→ Ссылка