Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/20: Рейтинг темы: голосов - 20, средняя оценка - 4.60
Kostek
4 / 4 / 0
Регистрация: 04.02.2009
Сообщений: 79
1

Прочитать кириллицу из файла

07.05.2009, 21:14. Просмотров 4094. Ответов 21
Метки нет (Все метки)

Не могу понять, почему не читает русские символы. Суть задания: извлечь из текстового файла, например data.txt, с русским текстом все гласные, а затем их вывести на экран. С латинскими нормально работает, а русские никак...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int main (void)
{int i = 0, num;
 FILE *fp;
 char c, *filename, buffer[512];
 printf("Vvedite imia fajla\n\n ");
 filename = GetString();
 fp = fopen(filename, "r"); 
 if (!fp)
   {puts("\nFajl ne najden");
    getch();
    exit(1);
   }
 while ((c = fgetc(fp)) != EOF)
   {if (c == 224 ||
        c == 229 ||
        c == 232 ||
        c == 238 ||
        c == 243 ||
        c == 251 ||
        c == 253 ||
        c == 254 ||
        c == 255 ||
        c == 184 ||
        c == 44)        
     {buffer[i] = c;
      i++;
     }
   }
 num = i; 
 printf("\nV fajle najdeny sledujuschie glasnye:\n");
 
 for (i=0; i < num; i++)
  printf ("%c", buffer[i]);
 fclose(fp);
 
 free(filename);
 getch();
 return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2009, 21:14
Ответы с готовыми решениями:

Прочитать числа из файла и записать их в два других файла по условию
Нужно написать простенькую программу которая берет из текстового файла числа и создает два других...

Из файла F1 прочитать матрицу A (10,20)
Из файла F1 прочитать матрицу A (10,20). Вычислить сумму элементов каждой строки, записать в...

Прочитать матрицу из файла
Нужно написать функцию, считывающую из текстового файла матрицу 5x5 для продолжения работы уже с...

Прочитать матрицу из файла
Только начал изучение языка, понимаю, что прога простая, но прошу помочь: Нужно написать программу...

Прочитать цифры из файла
У меня стоит такая задача: создать файл Х, и заполнить его целыми числами int, через запятую Потом...

21
Monte-Cristo
2799 / 1388 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
07.05.2009, 21:30 2
ну наверное потому, что консоль с кириллицей не очень дружит
0
Rififi
2366 / 1059 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
07.05.2009, 21:35 3
Гоогле:
"c++ printf русские буквы"
"c++ cout русские буквы"
0
CheshireCat
Эксперт С++
2915 / 1264 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
07.05.2009, 21:43 4
Скорее, причина в другом: Kostek, с чего ты взял, что коды 224, 229 и т.п. в консоли соответствуют именно русским гласным?
Попробуй так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
{if (c == 'А' ||
        c == 'Е' ||
        c == 'Ё' ||
        c == 'И' ||
        c == 'О' ||
        c == 'У' ||
        c == 'Э' ||
        c == 'Ю' ||
        c == 'Я' || ....
и то же самое для маленьких (строчных) букв от а др я
        ....
        с == 'я')
0
07.05.2009, 21:43
dimon_91
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
07.05.2009, 22:40 5
Глянь тему Русско-английский и англо-русский словарь
Там я выкладывал архив CyrIOS - для корректной работы с кириллицей. Закинешь файлы в директорию проекта и подключишь их в самом проекте. Не забудь в настройках проекта установить значение Character Set на Not Set.
0
Kostek
4 / 4 / 0
Регистрация: 04.02.2009
Сообщений: 79
08.05.2009, 01:23  [ТС] 6
Цитата Сообщение от CheshireCat Посмотреть сообщение
с чего ты взял, что коды 224, 229 и т.п. в консоли соответствуют именно русским гласным?
Документы *.txt вроде кодируются при в 1251 – MS Windows.
Так как ты предложил можно сделать только в старом Borland 3.1, и то не все буквы читает.
0
Kostek
4 / 4 / 0
Регистрация: 04.02.2009
Сообщений: 79
14.05.2009, 19:54  [ТС] 7
domon_91, я не совсем понял как засунуть в проект CyrIOS...
0
Alik-Soldier
9 / 9 / 2
Регистрация: 01.05.2009
Сообщений: 127
14.05.2009, 21:24 8
Kostek, CyrIOS засовываешь в папку с самим проектом в дебаг и в папку с названием проекта,далее подключаешь в коде заголовочник #include "CyrIOS" и все должно работать

Добавлено через 1 минуту 39 секунд
Только Character Set поставь на Not set, иначе будет выдавать 12 ошибок

Добавлено через 1 минуту 6 секунд
Только Character Set поставь на Not set, иначе будет выдавать 12 ошибок
0
MrAndrey_ka
79 / 79 / 20
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
14.05.2009, 21:29 9
Сообщение от CheshireCat
с чего ты взял, что коды 224, 229 и т.п. в консоли соответствуют именно русским гласным?
вообщето char ровняется типу signed char, а это значит что диапазон его значения от-128 до 127, как видим 224 туда не впихнуть
0
dimon_91
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
14.05.2009, 21:29 10
Закидываешь файлы в папку Debug проекта. В программе подключаешь его
C++
1
#include "CyrIOS.h"
На панельке Solution Explorer кликаешь правой кнопкой мыши на папке Header files и в контекстном меню выбираешь Add -> Existing item после чего указываешь путь к файлу CyrIOS.h . Аналогично в папку Source Files добавляешь CyrIOS.cpp . После этого в контекстном меню проекта (выше Header files) выбираешь Properties -> вкладка General -> выбирашь графу Character Set и устанавливаешь в ней Not Set. Теперь всё должно работать нормально.
Впрочем то, что выше описал Alik-Soldier ))))))
0
Kostek
4 / 4 / 0
Регистрация: 04.02.2009
Сообщений: 79
15.05.2009, 22:19  [ТС] 11
Все делал по рецепту, но выскакивает одна ошибка:
".\CyrIOS.cpp(138) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?"
Пробовал вставить этот #include "stdafx.h" в CyrIOS.cpp, но после этого выдает 128 ошибок.

Добавлено через 43 минуты 14 секунд
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
вообщето char ровняется типу signed char, а это значит что диапазон его значения от-128 до 127, как видим 224 туда не впихнуть
Справедливое замечание, но поменяв в проекте переменные char в соответствующих местах на unsigned char, компилятор просто зависает.
0
Alik-Soldier
9 / 9 / 2
Регистрация: 01.05.2009
Сообщений: 127
16.05.2009, 12:33 12
А ты когда создавал проект, ты его пустым создавал???в смысле Empty project?
0
Evg
Эксперт CАвтор FAQ
20072 / 7639 / 585
Регистрация: 30.03.2009
Сообщений: 21,378
Записей в блоге: 30
16.05.2009, 12:54 13
1. Нужно добавить #include <stdio.h>
2, Переменная c должна иметь тип int (а не char)
3. Замена на unsigned char ломается по следующей причине: значение EOF равно (int)-1 или 0xffffffff. Диапазон значений unsigned char'а - от 0 до 255 и этот диапазон сохраняется при преобразовании unsigned char -> int (т.к. ты сравниваешь c и EOF), в результате у тебя значение сравнения всегда ложь (и более-менее приличный компилятор в этом месте должен был выдать предупреждение об этом)
1
MrAndrey_ka
79 / 79 / 20
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
17.05.2009, 22:16 14
Цитата Сообщение от Kostek Посмотреть сообщение
Цитата:



Сообщение от MrAndrey_ka


вообщето char ровняется типу signed char, а это значит что диапазон его значения от-128 до 127, как видим 224 туда не впихнуть


Справедливое замечание, но поменяв в проекте переменные char в соответствующих местах на unsigned char, компилятор просто зависает.
в каких местах именно? может и ненужно менять было, а просто вместо 224 написать char(224)?
1
insolent
827 / 346 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
17.05.2009, 23:46 15
Я раньше тоже сталкивался с проблемой кириллицы:
менял кодировки, подключал дополнительно файл, но тут на форуме нашел неплохое решение:
C++
1
setlocale(0,"")
или
C++
1
setlocale(LC_ALL,".1251")
Работает на 5+.
1
Kostek
4 / 4 / 0
Регистрация: 04.02.2009
Сообщений: 79
18.05.2009, 23:06  [ТС] 16
Цитата Сообщение от Evg Посмотреть сообщение
1. Нужно добавить #include <stdio.h>
Добавил в CurIOS.h #include"stdafx" и #include <stdio.h>, выпадает все та же вышеупомянутая ошибка...
Если ты имел ввиду мой проект, то #include <stdio.h> в нем есть, я поместил здесь только упрощенную копию ф-ции Main/

Интересно, что data.txt содержит набор символов:
уцгшщхйкешзопполидтьсяь.тифждптлдтфлтридфжллорщекгцшхъгршеоиттьи.
Способы:
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
может и ненужно менять было, а просто вместо 224 написать char(224)?
и
Цитата Сообщение от insolent Посмотреть сообщение
setlocale(0,"")[/CPP] или
setlocale(LC_ALL,".1251")
как бы работают, но всегда выводят только эти пять символов: еиооу
0
Evg
Эксперт CАвтор FAQ
20072 / 7639 / 585
Регистрация: 30.03.2009
Сообщений: 21,378
Записей в блоге: 30
18.05.2009, 23:22 17
Я же написал, что вместо char'а надо использовать int. С char'ом у тебя на символе 'я' чтение из файла заканчивается
0
Kostek
4 / 4 / 0
Регистрация: 04.02.2009
Сообщений: 79
20.05.2009, 17:55  [ТС] 18
А почему именно на символе 'я' ?
0
Evg
Эксперт CАвтор FAQ
20072 / 7639 / 585
Регистрация: 30.03.2009
Сообщений: 21,378
Записей в блоге: 30
20.05.2009, 18:00 19
Потому что код 'я' равен 255 (0xff), EOF равно -1 (0xffffffff), а потому условие (c == EOF) равно true, т.к. правая часть сравнения сначала приводится к левой (из 0xffffffff при преобразовании к unsigned char получаем 0xff)
0
Kostek
4 / 4 / 0
Регистрация: 04.02.2009
Сообщений: 79
20.05.2009, 18:04  [ТС] 20
0
20.05.2009, 18:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2009, 18:04

Прочитать из файла числа и сравнивать их
Записать в файл список работников с указанием фамилии, пола, года рождения и специальности. Вывести...

Прочитать k-ую строку из текстового файла
написать ф-кцию get_line (filename, k) строкового типа, возвращающую k-ю строку текстового файла с...

Прочитать текст файла в массив
написать программу, считывающую символьный файл в динамическую память целиком пословно, формируя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru