Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
12 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 6

Даны три файла в 3х разных кодировках, перевести текст в Windows-1251 и записать в один файл

07.02.2015, 19:27. Показов 1813. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Даны три файла в 3х разных кодировках, перевести текст в Windows-1251 и записать в один файл.

В сущности я понимаю как это сделать (наверно), но есть несколько вопросов:
1. Как определить кодировку файла
2. Как перевести символы в 16-ричный код или код ASCII
3. Как правильно перевести эти символы в другую кодировку (не используя switch или что-то подобное, что будет очень громоздким)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2015, 19:27
Ответы с готовыми решениями:

Отобразить текст в Textbox из другого TextBox в разных кодировках без сохранения в файл
Доброго всем времени суток! Есть на форме несколько Textbox"сов. В 1-й Textbox вписывается текст как образец, а в остальных этот же...

Как записать строку в кодировке windows-1251 в файл
Добрый день, перечитал почти весь форум но решения проблемы не нашел. Прошу помочь специолистов. Задача в следующем. Есть файл в...

запись в файл в разных кодировках
Можите пожалуйста привести пример как записать в файл строку "hello world" посимвольно(каждая буква в разной кодировке) и перевод в...

10
 Аватар для igorrr37
2883 / 2030 / 992
Регистрация: 21.12.2010
Сообщений: 3,782
Записей в блоге: 9
07.02.2015, 19:55
1. Как определить кодировку файла
Открывай кодовую таблицу и смотри по таблице каждый байт файла. Если найдешь непечатный символ - данная кодировка отпадает.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.02.2015, 20:03
Цитата Сообщение от Nikkisora Посмотреть сообщение
2. Как перевести символы в 16-ричный код или код ASCII
C++
1
2
3
char s[100]; // Сюда прочитано
int kod = s[i];
printf("%2x", kod);
Второй вариант
C++
1
2
3
char c1 = kod>>4;
char c2 = (kod&15);
printf("%c%c", c1, c2);
Добавлено через 2 минуты
Цитата Сообщение от Nikkisora Посмотреть сообщение
3. Как правильно перевести эти символы в другую кодировку (не используя switch или что-то подобное, что будет очень громоздким)
Одно из решений проблемы
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
char *dtow(char *p)
{ char c;
   if (p==NULL) return NULL;
   while((c=*p)!='\0') {
     if      (c>=128 && c<176) c+=64;
     else if (c>=224 && c<240) c+=16;
     *p = c;
     p++;
   }
   return(p);
}
// *******************
char *wtod(char *p)
{ char c;
   while((c=*p)!='\0') {
     if (c>=192 && c<240) c-=64;
     else if (c>=240) c-=16;
     else if (c==184) c = 'е';
     *p = c;
     p++;
   }
   return(p);
}
// ******************
1
12 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 6
07.02.2015, 20:17  [ТС]
Цитата Сообщение от Байт
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
char *dtow(char *p)
{ char c;
   if (p==NULL) return NULL;
   while((c=*p)!='\0') {
     if      (c>=128 && c<176) c+=64;
     else if (c>=224 && c<240) c+=16;
     *p = c;
     p++;
   }
   return(p);
}
// *******************
char *wtod(char *p)
{ char c;
   while((c=*p)!='\0') {
     if (c>=192 && c<240) c-=64;
     else if (c>=240) c-=16;
     else if (c==184) c = 'е';
     *p = c;
     p++;
   }
   return(p);
}
// ******************
Можешь закоментировать или объяснить что делает этот код и как
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.02.2015, 20:29
Цитата Сообщение от Nikkisora Посмотреть сообщение
Можешь закомментировать или объяснить что делает этот код и как
Посмотри на кодовую таблицу и все поймешь сам. А не поймешь - делай через switch. На 20-м case, надеюсь, поймешь.

Добавлено через 1 минуту
Конечно, если ты ленив не менее, чем я.
Я понял на третьем.

Добавлено через 7 минут
Да, надо уточнить. У меня все char по дефолту - unsigned.
0
12 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 6
08.02.2015, 13:42  [ТС]
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
char cp866to1251(char p)
{
    char c;
    if (p == NULL) return NULL;
    if (p < 0) p = abs(p) + 128;
    while ((c = p) != '\0') {
        if (c >= 128 && c<176) c += 64;
        else if (c >= 224 && c<240) c += 16;
        p = c;
        p++;
    }
    return(p);
}
 
int main(void) {
    fstream hec("C:\\Users\\user\\Desktop\\hex.txt");
    fstream badc("C:\\users\\user\\desktop\\1.txt");
 
    char c;
    while (badc.get(c)){
        hec << cp866to1251(c);
    }
    hec.close();
    badc.close();
}
В чем ошибки?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.02.2015, 14:05
Цитата Сообщение от Nikkisora Посмотреть сообщение
В чем ошибки?
Какая?
Обрати внимание, в моем коде переводится строка, завершаемая нулем. А ты переводишь единственный символ. Значит, и код надо соответствующим образом изменить.
А у тебя все превращается в нули

Добавлено через 15 минут
Nikkisora, Я должен тебя благодарить. Благодаря тебе я нашел ошибку в своем коде, которому уже несколько лет. Дело в том, что он возвращает совсем не то, на что я рассчитывал. Слава Богу, этим возвращенным значением я нигде не пользовался. Но мог же и воспользоваться! И потом долго чесать репу....
Вот ведь оказывается, как полезно помогать другим
За это - лови!
C++
1
2
3
4
5
6
unsigned char cp866to1251(unsigned char p)
{  
    if (p >= 128 && p<176) p += 64;
    else if (p >= 224 && p<240) p += 16;
    return p ;
}
Добавлено через 1 минуту
Ну и строке 19 - unsigned char c;
0
12 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 6
08.02.2015, 14:16  [ТС]
C++
1
2
3
4
5
6
7
    string strline;
    if (badc){
        while (getline(badc, strline)){
 
            hec << cp866to1251((char*)strline.c_str()) << endl;
        }
    }
Ничего не поменялось. В чем ошибка?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.02.2015, 14:35
Цитата Сообщение от Nikkisora Посмотреть сообщение
В чем ошибка
Приведи полный код, входные и выходные данные (немного)
Чего ты там натворил, я не понял.
Возьми код из поста 6. Строки 1-13 замени на мой код из поста 7.
Если что-то не так - покажи и напиши внятно, что именно не так.
0
12 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 6
08.02.2015, 14:35  [ТС]
Окей, разобрался все выводит спасибо.

Только теперь появился еще один вопрос как заставить его выводить в файл не в расширенной кодировке ASCII а в cp1251?

Вот код если что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
unsigned char cp866to1251(unsigned char p)
{
    if (p >= 128 && p<176) p += 64;
    else if (p >= 224 && p<240) p += 16;
    return p;
}
 
int main(void) {
    fstream hec("C:\\Users\\user\\Desktop\\hex.txt");
    fstream badc("C:\\users\\user\\desktop\\1.txt");
 
    char c;
    if (badc){
        while (badc.get(c)){
            hec << cp866to1251(c);
        }
    }
 
    hec.close();
    badc.close();
}
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
08.02.2015, 16:35
Цитата Сообщение от Nikkisora Посмотреть сообщение
Как правильно
кодировщик текста из ср1251 в кои8-р
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.02.2015, 16:35
Помогаю со студенческими работами здесь

Как перевести текст из AnsiString (в формате UTF8) в AnsiString формата Windows-1251?
Поиск по форуму не решил текущую проблему: 1. Есть текст в формате UTF-8 в величине: AnsiString qw; Вопрос: 2. Как перевести текст в...

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

Даны текстовый файл f. Записать в файл g элементы файла f
в обратном порядке.(консоль) Кто-нибудь знает как? Помогите, прошу.

Даны 2 файла чисел. Записать в третий файл такие элементы первого файла, которых нет во втором.
Даны 2 файла чисел. Записать в третий файл такие элементы первого файла, которых нет во втором.

Перевести фамилию в кодировку Windows 1251
Закодируйте и разместите в разрядную сетку свою фамилию, используя базовую таблицу кодировки символов Windows 1251. Первая буква фамилии –...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru