Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> типизированные файлы, файлы 
:(
    Опции темы
Neon111
  Дата 24.12.2013, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.12.2013

Репутация: нет
Всего: нет



помогите пожалуйста все уже сделала но одну ошибка выдает что типо не объявлена функция для русских букв. Задание следующее:Файл f содержит буквы латинского и русского алфавитов.Занести в файл h- только латинские буквы, а в файл g-только русские буквы вот задание у меня проблема возникла с считыванием русских букв

Код

#include <vcl.h>
#include <conio.h>
#include <iostream>
#include <fstream>
using namespace std;



int main(int argc, char* argv[])
{
setlocale(LC_ALL, "Russian");
ifstream f("f.txt");
ofstream h("h.txt");
ofstream g("g.txt");

char temp;

if(!f)
{
cout«"Error opening input file(f)!\n";
return(1);
}
if(!h)
{
cout«"Error opening output file(h)!\n";
return(1);
}
if(!g)
{
cout«"Error opening output file(g)!\n";
return(1);
}
while(f.peek() != EOF)
{
temp = f.get();
if(isrus(temp))
g « temp;
else if(isalpha(temp))
h « temp; 
}


f.close();
h.close();
g.close();

return 0;
}

PM MAIL   Вверх
feodorv
Дата 24.12.2013, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Neon111 @  24.12.2013,  18:02 Найти цитируемый пост)
типо не объявлена функция для русских букв

Цитата(Neon111 @  24.12.2013,  18:02 Найти цитируемый пост)
isrus(temp)

Ну да, нет такой стандартной функции. Вы можете её создать самостоятельно, исходя из той кодировки, с которой работаете. Например, для кодировки Windows-1251:
Код

bool isrus( int c )
{
  c &= 0xff;
  if( (c & 0x80) == 0 ) return false;
  return (c == 0xa8 || c == 0cb8 || c >= 0xc0);
}


Также можно попробовать инвариантный по отношению к специфической кодировке вариант
Код

(c & 0x80) != 0 && isalpha( temp )

если setlocale отрабатывает правильно...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Neon111
  Дата 24.12.2013, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.12.2013

Репутация: нет
Всего: нет



Цитата(feodorv @ 24.12.2013,  18:13)
Цитата(Neon111 @  24.12.2013,  18:02 Найти цитируемый пост)
типо не объявлена функция для русских букв

Цитата(Neon111 @  24.12.2013,  18:02 Найти цитируемый пост)
isrus(temp)

Ну да, нет такой стандартной функции. Вы можете её создать самостоятельно, исходя из той кодировки, с которой работаете. Например, для кодировки Windows-1251:
Код

bool isrus( int c )
{
  c &= 0xff;
  if( (c & 0x80) == 0 ) return false;
  return (c == 0xa8 || c == 0cb8 || c >= 0xc0);
}


Также можно попробовать инвариантный по отношению к специфической кодировке вариант
Код

(c & 0x80) != 0 && isalpha( temp )

если setlocale отрабатывает правильно...

 а как для этой кодировки сделать?->UTF-8, помогите пожалуйста разобраться...
PM MAIL   Вверх
feodorv
Дата 25.12.2013, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Neon111 @  24.12.2013,  22:41 Найти цитируемый пост)
а как для этой кодировки сделать?->UTF-8

У Вас исходный файл в UTF-8? Тогда всё сложнее))) Тогда Вам нужно собрать юникодный символ из нескольких байт, проверить, кириллица ли это или нет, а уж затем печатать в файл (тоже в UTF-8?). А в самом начале провериться на наличие BOM.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Romikgy
Дата 25.12.2013, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



ИМХО быстрее преобразовать строку в юникод-16 и посимвольно проверять на русский...


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.