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

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

07.02.2015, 19:27. Показов 1792. Ответов 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
2870 / 2017 / 991
Регистрация: 21.12.2010
Сообщений: 3,734
Записей в блоге: 8
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
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru