Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633

Вывод информации в файл, Кириллица корректно не выводится

23.09.2022, 06:43. Показов 7549. Ответов 81
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Решил вывести информацию в файл по нажатии на кнопку "сохранить", но в файл отображается либо кракозябры, либо ничего, если текст на русском.
Вот код той части кода, которая должна выполнить задуманное:
Кликните здесь для просмотра всего текста
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
case uiButtons[0]:
{
    *(LPWORD)chBuf = (WORD)(128);
    int nNum = SendMessage(hEdit, EM_GETLINE, 0, (LPARAM)(LPTSTR)&chBuf);
    chBuf[nNum] = TEXT('\0');
    if (nNum)
    {
        TCHAR* NextToken = NULL;
        TCHAR* chTmp = _tcstok_s(chBuf, TEXT(" ,.;"), &NextToken);
        TCHAR sz[128];
        _stprintf_s(sz, 128, TEXT("%s"), TEXT("["));
                    
        for (size_t i = 0; (chTmp); ++i)
        {
            _tcscat_s(sz, 128, chTmp);
                    
            chTmp = _tcstok_s(NULL, TEXT(" ,.;"), &NextToken);
            if(chTmp)
                _tcscat_s(sz, 128, TEXT(""));
        }
        _tcscat_s(sz, 128, TEXT("]"));
                    /*_stprintf_s(sz, 128, TEXT("%s"), TEXT("["));
                    _tcscat_s(sz, 128, szFIO[0]);
                    _tcscat_s(sz, 128, szFIO[1]);
                    _tcscat_s(sz, 128, szFIO[2]);*/
                    
 
        int i;
        for (i = 0; i < 2; ++i)
        {
            if (SendMessage(hButtonSex[i], BM_GETCHECK, 0, 0L))
                break;
        }
                    
        _tcscat_s(sz, 128, TEXT("{"));
        if(i < 2)
            _tcscat_s(sz, 128, szSexNames[i]);
        _tcscat_s(sz, 128, TEXT("}"));
        for (i = 0; i < 4; ++i)
        {
            if (SendMessage(hButtonEduc[i], BM_GETCHECK, 0, 0L))
                break;
        }
        _tcscat_s(sz, 128, TEXT("{"));
        if(i < 4)
            _tcscat_s(sz, 128, szEducNames[i]);
        _tcscat_s(sz, 128, TEXT("}\0"));
                    
        FILE* hFout;
        errno_t IsError = _tfopen_s(&hFout,
                                    TEXT("D:\\EmployeeRecord.txt"),
                                    TEXT("a"));
        if (IsError != NULL)
        {
            MessageBox(NULL, TEXT("Can't open file"),
                       TEXT("Error"), MB_OK);
            return 0;
        }
        CHAR szDest[128];
 
        int iRes = 0;
        if(IsTextUnicode(sz, _tcslen(sz), &iRes))
            WideCharToMultiByte(CP_ACP, 0, sz, -1, 
                               (LPSTR)szDest, _tcslen(sz), NULL, NULL);
                                        
        if (hFout)
        {
            fputs(szDest, hFout);
            fclose(hFout);
        }
        _fcloseall();
    }
    return 0;
}

Если честно, то я иссяк и хоть это не так важно на данный момент - я про вывод информации в файл, но, думаю, что лишним подобные знания не будут. В чём мой косяк? По идее должно выводить без проблем. Считывая строку из элемента управления "edit" в каком формате ANSII или UNICODE она попадает в буфер?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.09.2022, 06:43
Ответы с готовыми решениями:

Вывод информации - кириллица и латиница вместе
Бодрого дня, господа. До недавнего времени я был уверен, что gotoxy(х,у); задает абсолютные координаты, ни отчего не зависящие. Но,...

Вывод информации с файла на консоль. Не выводится информация с файлов
Написал прогу для вывода информации из файлов, но что-то пошло не так. Все скомпилировалось без ошибок, но когда я делаю выбор в...

Ввод вывод в файл и консоль.(Кириллица)
int main() { setlocale(LC_ALL, &quot;rus&quot;); ifstream a(&quot;qwe.txt&quot;); string x, y; getline(cin, x); //1- ввод из консоли в (x) ...

81
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
26.09.2022, 15:36
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Замабувараев Посмотреть сообщение
Сишник думает, что Си — это единственный язык программирования из пяти тысяч созданных
Это ближе к правде, чем фантазии winapi-шника будто все языки должны подстраиваться под конкретную операционку.
Впрочем, если хотите, можете привести хотя бы пару языков (кроме C# и подобных, разработанных изначально под винду, разумеется), которые следуют вашему шаблону.
Цитата Сообщение от Замабувараев Посмотреть сообщение
игнорируя все современные интерфейсы, железо и парадигмы разработки.
То есть игнорируя все то, что в Си поддерживается, а в winapi - нет?
Напоминаю: под новые процессоры, контроллеры, ядра и прочее железо первым пишут именно компилятор Си, а вовсе не винду. Более того, ее даже на ARM портировать толком не могут.
Полторы архитектуры железа, вот он ваш эталон претендента на стандарт!
Цитата Сообщение от Замабувараев Посмотреть сообщение
Но если так делать, то много чего исчезнет, например, сетевое программирование, которое ни в каком стандарте языка Си не описано.
Ну так не делайте так. Сами придумали какую-то чушь, сами же ее героически опровергаете.
Цитата Сообщение от Liss29 Посмотреть сообщение
Последовательно, значит сначала один поток её разложит затем второй, если, конечно, последовательно здесь употребляется в том же контексте.
Да, я говорил именно про это. Но почему этот вариант хуже, чем если строки перемешаются?
Цитата Сообщение от Liss29 Посмотреть сообщение
В памяти строка располагается по одному и тому же адресу, правильно, или для каждого потока своя память выделяется
Разница между процессом и потоком в том, что процесс это по сути независимая программа, у которой вся память личная, ни с кем неделимая. А поток это часть общей программы, разные потоки обращаются к одной и той же памяти, хотя при желании можно и персональные участки выделять, но никакой защиты для них не будет.
Так вот, если речь о разных процессах (все равно как если вы запустите несколько раз одновременно один и тот же экзешник), никакого конфликта не будет. А если о потоках, да еще на чистом strtok (без внешней переменной для хранения), уже будут проблемы. Для решения которых эту переменную собственно и ввели.
Цитата Сообщение от Liss29 Посмотреть сообщение
Но можно заблокировать поток на время его выполнения, разве это не вариант, особенно, если он меняет данные строки, массива или переменных.
Несколько потоков выделяют чтобы программа могла работать в несколько раз быстрее. Какой смысл это делать, а потом искусственно вводить очередность и заставлять потоки работать по очереди?
Цитата Сообщение от Liss29 Посмотреть сообщение
А чтобы это понимать или хотя бы попытаться понять, нужно изучать как это работает, для начала, других способов понять я не знаю.
Просто не пользуйтесь нестандартными функциями без необходимости.
В большинстве случаев об их существовании вы узнаете, когда начнете гуглить какую-нибудь специфичную проблему, а то и просто случайно. Либо при попытках закопаться вглубь системы.
А изучать подобные вещи впрок почти бесполезно: их слишком много, без сколь-нибудь существенной практики (по сути - решения практической задачи) вы их толком не изучите, а потом еще и забудете.
Поэтому просто занимайтесь тем, что вам интересно, или нужно в жизни и не теряйте любопытства.
Цитата Сообщение от Liss29 Посмотреть сообщение
Я точно не помню, по моему он там показывает пример, как можно реализовать свой сборщик мусора
Сборщик мусора это довольно низкоуровневая вещь. Хотя если бы я захотел делать его модель, обошелся бы обычным malloc'ом. Все-таки способов работы с памятью в различных ОС довольно много - вплоть до заранее зарезервированного буфера без выделения-освобождения во всяких контроллерах. Изучать какой-то конкретный имеет смысл только если вы строго решили писать ядро, драйвера или компилятор/интерпретатор под конкретную ОС.
Цитата Сообщение от Liss29 Посмотреть сообщение
По сути, без него сейчас никак, в большинстве своём пишут с GUI-интерфейсом.
Вы же сами сказали про fltk, для его использования winapi не нужен. Да и для любой другой системы визуальных компонентов - gtk, Qt, nuklear - тоже.
Я недавно писал GUI для скриптов на языке Lua для автоматизации работы с измерительными приборами. И в качестве виджетов взял именно gtk. Основная система на моей рабочей машине Linux, но проверял и на виндовых виртуалках. Как минимум до winXP вполне работает. При том, что я по сути не знаю ни winapi, ни X11/wayland (это линуксовый аналог winapi, но только для оконной системы, именно поверх него тот же gtk работает). Разумеется, не без косяков, но так это по сути мой первый проект с более-менее нормальным GUI. Да, Замабувараев, я довольно много пишу на Си как под ПК, так и под МК, а вот с гуйней столкнулся впервые. Демки на SDL+OpenGL не в счет, GUI там по сути нет. Большая часть реальных задач гораздо проще решается в консоли или с минимальным использованием графики.
Цитата Сообщение от Liss29 Посмотреть сообщение
Для начал нужно тогда уж изучение начать с самой ОС Линукс, а уж потом программировать пытаться, а это не маленькая тема. Это абсолютно иное устройство ОС. Так что у меня стоит Ubuntu на виртуальной машине
Для себя я не считаю время, потраченное на изучение линукса выброшенным впустую. Но я это делал из любопытства. У вас могут быть совершенно другие интересы. И практика показывает, что навязывать кому-то свою точку зрения, по крайней мере по спорным вопросам, приносит больше вреда, чем пользы.
И нет, вопрос следования стандартам практически не спорный. Стандарты для того и нужны. А замыкаясь в узкой нише вроде того же winapi, вы серьезно ограничиваете себе как кругозор, так и возможность роста.
Отдельно отмечу, что если вы хотите стать именно специалистом по ядру винды, тогда да, надо изучать именно его. Равно как специалист-эмбеддер будет изучать именно архитектуру контроллеров, а программист-трехмерщик возможности видеокарт и устройство графических библиотек. Но из ваших сообщений я могу предположить, что вы только знакомитесь с программированием, и не определились со специализацией. А в таком случае стоит изучить всего понемногу.
Цитата Сообщение от Liss29 Посмотреть сообщение
Кому как. Если это простейшие команды, то да, а если нет, тогда нужно помнить кучу всяких параметров
Так для систем сборки кучу параметров помнить не нужно, они один раз прописываются, а потом кочуют из проекта в проект. Для тех же контроллеров флаги сборки могут быть совершенно мозговыносящими, но опять же - один раз их подобрал (а то и скопипастил из чужого makefile'а) и больше туда не лазаешь. Если хотите, могу показать пару своих makefile'ов, просто чтобы показать, что запоминанию оно не поддается. Ну и поржать над костылями
Цитата Сообщение от Liss29 Посмотреть сообщение
Видимо так, если TrueType имеется ввиду.
TrueType это просто векторный шрифт. Он может быть, а может и не быть моноширинным. Просто современный способ хранения изображений букв, не более. Он лучше растрового только в том, что масштабируется легко: можно хоть 8 размер шрифта выставить, хоть 20-й, хоть 3.14-й, форма букв искажаться не будет. Ну и поддержка расстояний между буквами. Не-моноширинных растровых я не припомню. Но ведь и векторную букву вы можете нарисовать по заданным координатам, без привязки к соседям. Если захотите, конечно.
Цитата Сообщение от Liss29 Посмотреть сообщение
Я думал, что консоль работает с ASCII кодировкой, а это 127 символов т.е. тип char, который как раз подходит под функции с окончанием SomeFunctionA, да и места занимают меньше.
ASCII действительно 7-битный, но при хранении все равно расширяется до байта, иначе было бы слишком медленно. И практически все остальные кодировки с ним совместимы. Исключение разве что utf-16 и utf-32, других я не знаю. Собственно именно поэтому utf-8 это стандарт кодирования. Для латинских букв, цифр и спецсимволов он ведет себя абсолютно аналогично ASCII, то есть отличная совместимость "забесплатно". Но и закодировать какой-нибудь китайский иероглиф без проблем можно.
Жаль только, винда в юникод за столько лет так толком и не научилась... Такое ощущение, что при написании софта под винду проще сразу писать свои реализации ввода-вывода, чем пытаться допилить те, что есть.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
27.09.2022, 12:11  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но почему этот вариант хуже, чем если строки перемешаются?
э
Без понятия! Одна и та же строка буде разложена дважды, зачем, производительность?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А если о потоках, да еще на чистом strtok (без внешней переменной для хранения), уже будут проблемы. Для решения которых эту переменную собственно и ввели.
Мне кажется я сейчас уже не в те дебри залез процессы потоки это прикольно, но пока что я другой тематикой занимаюсь. Что за внешняя переменная, если я создам, скажем, переменную int i; глобально, то в двух разных процессах одного и того же экземпляра приложения она в безопасности, а вот в случае двух потоков одного процесса, нет. Или это про другое?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Несколько потоков выделяют чтобы программа могла работать в несколько раз быстрее. Какой смысл это делать, а потом искусственно вводить очередность и заставлять потоки работать по очереди?
Если они(потоки) заставят программу работать быстрее, но при этом программа будет выдавать не те результаты, то зачем нужна такая программа. Вопросы на которые я не знаю что ответить.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Сборщик мусора это довольно низкоуровневая вещь. Хотя если бы я захотел делать его модель, обошелся бы обычным malloc'ом.
Наверное он именно из-за этого его и показывал что бы некоторые вещи показать, которые скрыты за malloc, new, delete только с практическим применением. Ассемблер же существует, хотя, большинство скажет, что даже заморачиваться на нём не стоит т.к. полно других модных, современных языков и тем не менее есть люди, которые на нём работают. А для этого тоже нужно знать массу низкоуровневых вещей.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Большая часть реальных задач гораздо проще решается в консоли или с минимальным использованием графики.
Может и так, смысл спорить, но графики, например, луче всё же в окнах рисовать в консоли это делать полный трешь.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А в таком случае стоит изучить всего понемногу.
Что я и делаю. Попробовал С++, ассемблер, немного Си, сейчас пробуй winapi, но реальных задач не решал, вот так.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если хотите, могу показать пару своих makefile'ов, просто чтобы показать, что запоминанию оно не поддается. Ну и поржать над костылями
А вы думаете я их пойму, тем более с костылями?) Ну не знаю стоит параметры знать или не стоит я, напримере, написал мак-файл, да он собирает проект, но этот проект весит гораздо больше, чем тот же проект, но собранный в студии, как так, а вот так, параметры, а их для компилятора куча, не знаю досконально вот и результат.)

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
TrueType это просто векторный шрифт. Он может быть, а может и не быть моноширинным. Просто современный способ хранения изображений букв, не более. Он лучше растрового только в том, что масштабируется легко:
Дело не в тонкостях восприятия я на данном этапе от количества параметров в структурах, которые нужно усвоить, пребываю в шоке. Всё остальное меня пока что мало волнует, а вот и добрался я до изучения этого ... шрифтов, как-то сразу изучать перехотелось)

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Такое ощущение, что при написании софта под винду проще сразу писать свои реализации ввода-вывода, чем пытаться допилить те, что есть.
Имеется ввиду ввод/вывод на консоль?
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
27.09.2022, 17:28
Цитата Сообщение от Liss29 Посмотреть сообщение
Без понятия! Одна и та же строка буде разложена дважды, зачем, производительность?
Максимально дурацкий синтетический пример, как будто бы два потока. Ожидается, что один будет парсить одну строку, второй - вторую. Думаю, даже без компиляции поймете где ошибка.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>
 
int main(){
  char str1[] = "Some string 123";
  char str2[] = "Some another text 456";
  char *s1, *s2;
  s1 = strtok(str1, " ");
  s2 = strtok(str2, " ");
  while( s1 || s2 ){
    if(s1 != NULL){
      printf("Thread 1: %s\n", s1);
      s1 = strtok(NULL, " ");
    }
    if(s2 != NULL){
      printf("Thread 2: %s\n", s2);
      s2 = strtok(NULL, " ");
    }
  }
  printf("\n");
}
Цитата Сообщение от Liss29 Посмотреть сообщение
если я создам, скажем, переменную int i; глобально, то в двух разных процессах одного и того же экземпляра приложения она в безопасности, а вот в случае двух потоков одного процесса, нет. Или это про другое?
Да, именно так. Псевдокод:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int var = 1;
void func1(){
 while(var < 5){
    var++;
    printf("Thread 1: %i\n", var);
  }
}
void func2(){
  while(var < 5){
    var++;
    printf("Thread 2: %i\n", var);
  }
}
...
start_thread(func1);
start_thread(func2);
В зависимости от фазы Луны вывод может быть
Code
1
2
3
Thread 1: 2
Thread 1: 3
Thread 1: 4
Или
Code
1
2
3
Thread 2: 2
Thread 2: 3
Thread 2: 4
Или
Code
1
2
3
Thread 1: 2
Thread 2: 3
Thread 1: 4
Два потока изменяют одну и ту же общую переменную без определенного порядка. А если запускать как два процесса, то
Code
1
2
3
4
5
6
Thread 1: 2
Thread 1: 3
Thread 1: 4
Thread 2: 2
Thread 2: 3
Thread 2: 4
А может и так:
Code
1
2
3
4
5
6
Thread 1: 2
Thread 2: 2
Thread 1: 3
Thread 2: 3
Thread 1: 4
Thread 2: 4
То есть порядок все еще не определен, но хотя бы друг другу не мешают. Попутно из этого следует вывод, что вводом-выводом заниматься должен единственный поток.
Цитата Сообщение от Liss29 Посмотреть сообщение
Если они(потоки) заставят программу работать быстрее, но при этом программа будет выдавать не те результаты, то зачем нужна такая программа. Вопросы на которые я не знаю что ответить.
Чтобы программа выдавала правильные результаты, ее всего лишь нужно правильно написать. Да, у многопоточности есть своя специфика, которую нужно освоить прежде, чем будете пользоваться.
Цитата Сообщение от Liss29 Посмотреть сообщение
Может и так, смысл спорить, но графики, например, луче всё же в окнах рисовать в консоли это делать полный трешь.
Для просмотра графиков или другой визуализации не нужно кнопок, оконных событий и всего остального. Создать окно, нарисовать на нем график или что там надо, дождаться закрытия - все. Для такого достаточно SDL + OpenGL.
Кстати, когда я подобным образом отображал результаты моделирования для конференции, помимо собственно рисования сделал вывод в кучу bmp'шек, благо формат простой.
Цитата Сообщение от Liss29 Посмотреть сообщение
но реальных задач не решал, вот так.
Неужели, ни разу в жизни не встречалось задач, которые бы можно было автоматизировать? Или хотя бы сделать красивую демку.
Помню, в школе нам рассказывали про BorlandPascal, а я на нем делал примитивный графический редактор. Даже картинку какую-то нарисовал... и только потом сообразил, что не написал функцию сохранения.
Цитата Сообщение от Liss29 Посмотреть сообщение
А вы думаете я их пойму, тем более с костылями?)
Нет, так я ж не для этого предлагаю, а так, побояться.
Цитата Сообщение от Liss29 Посмотреть сообщение
Дело не в тонкостях восприятия я на данном этапе от количества параметров в структурах, которые нужно усвоить, пребываю в шоке. Всё остальное меня пока что мало волнует, а вот и добрался я до изучения этого ... шрифтов, как-то сразу изучать перехотелось)
Формат у них сложный, лучше не рукми их рендерить, а библиотеками. Тот же SDL вполне умеет выводить текст заданным шрифтом в заданное место.
Цитата Сообщение от Liss29 Посмотреть сообщение
Имеется ввиду ввод/вывод на консоль?
В первую очередь да, но и с оконным не все так просто. Вы вон в функции *A / *W воткнулись.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
27.09.2022, 18:36
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть игнорируя все то, что в Си поддерживается, а в winapi - нет?
Стандартная библиотека должна скрывать потроха ОС, и под капотом конвертировать родные для ОС строки в char.
А вы вынуждены бороться и воевать с этой библиотекой, вставляя костыли. Смех.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
27.09.2022, 20:01
Цитата Сообщение от Замабувараев Посмотреть сообщение
А вы вынуждены бороться и воевать с этой библиотекой, вставляя костыли. Смех.
Не-а, со своей стандартной библиотекой воевать приходится как раз вам, виндузятникам. В более дружелюбных ОС подобных проблем нет: просто везде используется юникод.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Стандартная библиотека должна скрывать потроха ОС, и под капотом конвертировать родные для ОС строки в char.
Сложный вопрос. А если ОС двуязычная? А если больше? А если вход вообще не с stdin'ом связан, а приходит с другой программы? Так что по дефолту конвертаций быть как раз не должно, тем более в низкоуровневых языках вроде Си.
Вот в каком-нибудь Питоне - пожалуйста. Собственно, там даже кодировка динамически выбирается: ascii -> utf-16 -> utf-32 в зависимости от символов в строке.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
28.09.2022, 11:50  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Думаю, даже без компиляции поймете где ошибка.
Здесь имеется ввиду условие цикла, мне так кажется, когда первая строка уже будет разложена, вторая строка ещё будет раскладываться.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Чтобы программа выдавала правильные результаты, ее всего лишь нужно правильно написать.
Да, казалось бы, но оказывается, не всё так просто. Легче сказать, чем сделать. Я же на данный момент многопоточностью не занимаюсь.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Для просмотра графиков или другой визуализации не нужно кнопок, оконных событий и всего остального. Создать окно, нарисовать на нем график или что там надо, дождаться закрытия - все. Для такого достаточно SDL + OpenGL.
Вообще я здесь про WinApi , спрашиваю, а вы мне про библиотеки, я знаю, что можно, много чего можно, но не нужно мне сейчас про библиотеки я ими не пользуюсь(на данный момент). Серьёзных задач не решаю, проф. программистом не являюсь, хочу вникнуть в то, что сейчас изучаю.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Неужели, ни разу в жизни не встречалось задач, которые бы можно было автоматизировать?
Нет, были кое какие иди, для своей винды кое что забабахать, но не смог реализовать, так что нет, таких задач не было.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В первую очередь да, но и с оконным не все так просто. Вы вон в функции *A / *W воткнулись.
да, есть такое и я почему то уверен, что повториться ещё и не раз.)
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
28.09.2022, 17:19
Цитата Сообщение от Liss29 Посмотреть сообщение
Здесь имеется ввиду условие цикла, мне так кажется, когда первая строка уже будет разложена, вторая строка ещё будет раскладываться.
Нет. Хорошо, тогда попробуйте этот пример скомпилировать и проверить. Можете поменять сами строки, например.
Цитата Сообщение от Liss29 Посмотреть сообщение
Вообще я здесь про WinApi , спрашиваю, а вы мне про библиотеки
Это был всего лишь пример, что полноценное GUI нужно довольно редко, гораздо чаще задача прекрасно решается в консоли или с минимальной графикой (без особого взаимодействия с пользователем).
Цитата Сообщение от Liss29 Посмотреть сообщение
да, есть такое и я почему то уверен, что повториться ещё и не раз.)
Ну разумеется, повторится! Решать одни и те же задачи, в которых не встречается новых проблем или технологий - какой интерес?
Цитата Сообщение от Liss29 Посмотреть сообщение
Я же на данный момент многопоточностью не занимаюсь.
Вообще я здесь про WinApi
Так никто вас и не отговаривает. Занимайтесь тем, что интересно. Понимаю, что мы здорово ушли от темы, но... а есть сейчас что обсуждать по теме-то?
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
29.09.2022, 06:30  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Нет. Хорошо, тогда попробуйте этот пример скомпилировать и проверить. Можете поменять сами строки, например.
Скомпилировал, проверил почему-то после входа в цикл раскладывается вторая строка и всё, но почему, не понял. Если бы это были потоки, то тут угадать, какой поток будет первым, а какой вторым невозможно т.к. система сама выбирает какой из потоков запустить по истечении кванта времени, а здесь почему так... Может быть строка буферизируется и в цикле раскладывается буферизированная строка. Тогда, если создать два цикла для обработки каждой строки, то всё должно работать правильно. Да, точно, если оформить так, то работает. Значит я прав или где-то рядом.
Если всё же, говорить о потоках, то сначала отработать должен один поток, а затем второй, иначе, выдаются неправильные результаты, значит, чтобы два потока отработали параллельно нужно чтобы каждый поток имел свой набор обрабатываемых данных.
Кликните здесь для просмотра всего текста
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
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include <conio.h>
 
#include <string.h>
 
int main(){
      char str1[] = "Some string 123";
      char str2[] = "Some another text 456";
      char *s1, *s2;
      s1 = strtok(str1, " ");
      while(s1)
      {
        if(s1 != NULL){
          printf("Thread 1: %s\n", s1);
          s1 = strtok(NULL, " ");
        }
      }
      s2 = strtok(str2, " ");
      while(s2)
      {
         if(s2 != NULL){
          printf("Thread 2: %s\n", s2);
          s2 = strtok(NULL, " ");
        }
      }
      printf("\n");
     _getch();
  return 0;
}


Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это был всего лишь пример, что полноценное GUI нужно довольно редко, гораздо чаще задача прекрасно решается в консоли или с минимальной графикой (без особого взаимодействия с пользователем).
Может и так, но разве не ваши слова, что нужно по ни многу изучать одно, другое, третье, а там глядишь, проще будет разобраться, что нужно, а что нет. Просто, на мой взгляд, взаимодействия с программами с графическим интерфейсом куда проще, чем, если таковой отсутствует, а присутствует управление с консоли, тут, видимо, дело привычки.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Решать одни и те же задачи, в которых не встречается новых проблем или технологий - какой интерес?
Проблемы одни и те же встречаются регулярно, и ошибки практически идентичные разве что с небольшими корректировками, никуда не уходят откуда тут новые технологии) На этапе обучения подобное здорово бьёт по самооценке, особенно, когда сам не можешь решить, а получив ответ бьёшь себя по голове: "и как я сам до этого не допёр ... !"

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
а есть сейчас что обсуждать по теме-то?
Конечно, я же уже писал, что начал изучать вывод в окна, а конкретно, что меня вводи в ступор на данный момент - это работа с текстом на WinApi. Первое же задание ввело ступор, сижу дешифрую, что автор задания хочет? Вот такой вопрос:
От левого верхнего до нижнего правого угла области окна вывести текст таким образом, чтобы он полностью помещался в окне при любых изменениях размеров окна. Использовать шрифт Times New Romans Cyr.
Мысль такая, возможно, нужно работать с размерами шрифта, но, если изменить размер окна только в ширину, тогда символы будут выглядеть очень не пропорционально, как мне кажется.
Смущает формулировка "при любых изменениях размеров окна.", что тут имеется ввиду никак не пойму, возможно, вообще нужно вывести одну строку по диагонали). Тексты бывают разных размеров, как можно изменять размеры окна и при этом текст должен помещаться в окне да ещё и без полос прокрутки, о них тут не слова, хорошо, изменил размер шрифта, но есть предел размера как в большую так и в меньшую сторону. Что делать, как быть...
На данный момент я сделал следующее:
Кликните здесь для просмотра всего текста
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
LRESULT CALBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static int cxClient, cyClient;
    static HFONT hFont, hOldFont;
    static LOGFONT lf, TEXTMETRICS tm;
    switch(msg)
    {
        case WM_CREATE:
        {
            lf.lfHeight = 0;
            lf.lfWidth = 0;
            lf.lfEscapement = 0;
            lf.lfOrientation = 0;
            lf.lfWeight = FW_DONTCARE;
            lf.lfItalic = 0;
            lf.lfUnderLine = 0;
            lf.lfStrileOut = 0;
            lf.lfCharSet = DEFAULT_CHARSET;
            lf.lfOutPrecision = OUT_STROK_PRECIS;
            lf.lfClipPrecision = 
            lf.lfQuality = PROOF_QUALITY;
            lf.lfPitchAndFamily = DEFAULT_PITCH;
            _tcscpy_s(lf.lfFaceName, _
                      _tcslen(TEXT("Times New Roman Cyr")/(sizeof(TCHAR)),
                      TEXT("Times New Roman Cyr"));
            hFont = CreateFontIndirect(&lf);
            return 0;
        }
        case WM_SIZE:
        {
            cxClient = LOWORD(lParam);
            cyClient = HOWORD(lParam);
            GetTextMetrics(hwnd, &tm);
            
            int cxChar = tm.tmAveCharWidth;
            int cyChar = tm.tmHeight + tm.tmExternalLeading;
            //Количество символов, которое можно разместить в строке 
            cxNumberOfChars = cxClient / cxChar;
            //Количество строк в рабочей области. 
            cyNumberOfChars = cyClient / cyChar;
            
            return 0;
        }
        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            /*Получить строку
                вывести количество символов, которое помещается в строке
                если в строке не пуста
                    перейти на новую строку
                    перенести оставшиеся символы на новую строку.
                иначе 
                    перейти на новую строку
             перейти к началу цикла.
             */
            EndPaint(hwnd, &ps);
            return 0;
        }
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
29.09.2022, 08:38
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не-а, со своей стандартной библиотекой воевать приходится как раз вам, виндузятникам.
ОС разные бывают. На каких‐то ОС функция вывода строки на консоль называется WriteConsole, где‐то write, а где‐то вообще нужно вызывать прерывание процессора.
Стандартная библиотека все эти тонкости должна скрывать и предоставлять единый интерфейс в виде функции print. Вам не надо знать в какие регистры класть указатели на строку и в какой последовательности помещать параметры в стэк. Вам нужно просто вызвать print и стандартная библиотека сделает это за вас. И если формат си‐строк не соответствует родным строкам в ОС, то стандартная библиотека должна их конвертировать, чтобы обеспечить единый интерфейс.
Грош цена стандартной библиотеке, которая это не умеет.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
29.09.2022, 10:48
Цитата Сообщение от Liss29 Посмотреть сообщение
Может быть строка буферизируется и в цикле раскладывается буферизированная строка.
Именно! А теперь сравните с кодом strtok_r или wcstok:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
 
int main(){
  char str1[] = "Some string 123";
  char str2[] = "Some another text 456";
  char *s1, *s2;
  char *buf1, *buf2;
  s1 = strtok_r(str1, " ", &buf1);
  s2 = strtok_r(str2, " ", &buf2);
  while( s1 || s2 ){
    if(s1 != NULL){
      printf("Thread 1: %s\n", s1);
      s1 = strtok_r(NULL, " ", &buf1);
    }
    if(s2 != NULL){
      printf("Thread 2: %s\n", s2);
      s2 = strtok_r(NULL, " ", &buf2);
    }
  }
  printf("\n");
}

Вот для этого последний аргумент и используется - для буферизации входной строки между вызовами.
Цитата Сообщение от Liss29 Посмотреть сообщение
Если всё же, говорить о потоках, то сначала отработать должен один поток, а затем второй
Нет. Если вручную выстраивать потоки последовательно, то толку от них не будет. Достаточно использовать потоко-безопасные функции, то есть те, которые не используют скрытые переменные. Как та же wcstok например.
Цитата Сообщение от Liss29 Посмотреть сообщение
#include <conio.h>
Если это у вас используется только ради getch, лучше замените на system("pause"); Для вас разницы не будет, зато и у окружающих с компиляцией проблем не будет. conio.h это DOS-специфика, у меня в линуксе, например, ее нет.
Цитата Сообщение от Liss29 Посмотреть сообщение
Просто, на мой взгляд, взаимодействия с программами с графическим интерфейсом куда проще, чем, если таковой отсутствует, а присутствует управление с консоли, тут, видимо, дело привычки.
Скажем, если задача одноразовая, или делается только под себя, стоит ли заморачиваться с созданием окна, всех виджетов, обработки событий - или достаточно выдавать текстовые запросы.
Так что да, это вопрос привычки и собственно задачи. И я вас ни в коем случае не отговариваю что-либо изучать. Напротив, умение собрать хотя бы примитивный GUI на чистом winapi без сторонних библиотек бывает полезно.
Цитата Сообщение от Liss29 Посмотреть сообщение
Проблемы одни и те же встречаются регулярно, и ошибки практически идентичные разве что с небольшими корректировками, никуда не уходят
Ну так практика. Наберете побольше опыта, будете решать шаблонные задачи шаблонными методами, не отвлекаясь от обдумывания архитектуры мега-хелловорлда.
Цитата Сообщение от Liss29 Посмотреть сообщение
От левого верхнего до нижнего правого угла области окна вывести текст таким образом, чтобы он полностью помещался в окне при любых изменениях размеров окна. Использовать шрифт Times New Romans Cyr.
Тут вряд ли смогу помочь: как я и говорил, ни знаний winapi, ни опыта создания GUI у меня нет.
Но по формулировке могу предположить совершенно практическую расшифровку - чтобы текст всегда помещался в окне и был читаем. То есть разбиение на несколько строчек, в том числе когда вы хватаете окно за угол и начинаете его ресайзить. И скорее всего, в winapi какой-то стандартный способ для этого есть.
Изменение размера шрифта вряд ли. Это чит, и я плохо представляю, где бы это пригодилось в реальной жизни.
Цитата Сообщение от Замабувараев Посмотреть сообщение
ОС разные бывают. На каких‐то ОС функция вывода строки на консоль
Не забывайте главное - вместо консоли может быть любой другой файл или поток другой программы. В таком случае ваша непрошенная конвертация просто будет портить данные.
Цитата Сообщение от Замабувараев Посмотреть сообщение
И если формат си‐строк не соответствует родным строкам в ОС...
...то его правильным отображением должен заниматься терминал.
Причем я могу понять и оправдать костыли вроде SetConsoleCP: при наличии нескольких кодировок узнать правильную ему больше неоткуда. Туда же isatty: если вывод идет на терминал, можно узнать его размер, работать с цветами, рисовать псевдографику.
Но вот преобразовывать нажатия на клавиатуре в коды символов в заданной кодировке и наоборот, зная кодировку рисовать символы именно в соответствии с ней - задача именно терминала.
Кстати, Liss29, тоже интересный пример упражнения - реализация терминала.
Ведь как работает эмулятор терминала.
Это окно в графическом окружении. Оно умеет обрабатывать нажатия клавиш - букв, цифр, стрелочек, функциональных - и переводить сканкоды в символы заданной кодировки*. Дальше эти символы собираются в строку: мы ведь можем ее редактировать, пока не нажали энтер. Перемещение курсора, делет, бэкспейс, копирование-вставка и все такое. Всем этим занимается именно терминал, а не юзерская программа**. Когда строка сформирована, она передается на stdin юзерской программы. Одновременно с stdout и stderr читается ее вывод и отображается в окне терминала. Плюс терминал может обрабатывать управляющие клавиши вроде ctrl+C, ctrl+Z и подобных.
.
Придется освоить оконный ввод, и главное - вывод. Редактирование строк (само по себе непросто). Запуск сторонних программ и подмена stdin/stdout/stderr на собственные. Неблокирующий ввод-вывод (пока мы ждем ввода от программы, обработка оконных событий прекращаться не должна). Возможно, кодировки (но явно не приоритет). В общем, довольно сложная задача.
.
*Первые терминалы, которые были именно терминалами - отдельными устройствами из принтера и клавиатуры и подключавшимися к компьютеру по COM-порту - скорее всего знали только одну кодировку, намертво зашитую в память. Поэтому если бы упражнение по кодингу терминала делал я, на первом этапе ограничился бы единственной кодировкой ASCII или UTF-8 в зависимости от графической библиотеки. Собственно, я точно не знаю, как задать кодировку в современных эмуляторах терминала - в этом просто нет нужды, везде utf-8, в крайнем случае iconv поможет. В виндовом, очевидно, SetConsoleCP и подобные. Можно еще попробовать читать переменную окружения LOCALE, но это уже извращение.
** Есть еще так называемый "неканоничный режим", когда коды передаются непосредственно в юзерскую программу без отображения на экране и ожидания энтера. Тот же _getch() примерно так работает. Но для первой версии оно явно не нужно.
Цитата Сообщение от Замабувараев Посмотреть сообщение
И если формат си‐строк не соответствует родным строкам в ОС...
...то совместимость - забота ОС. Грош цена той ОС, которая этого не умеет.
Логично решить эту проблему один раз при разработке ОС/терминала, чем раз за разом при написании каждой утилиты.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
29.09.2022, 18:22
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
...то совместимость - забота ОС. Грош цена той ОС, которая этого не умеет.
То есть ОС должна определять на каком языке написана программа и подсовывать родной для этого языка формат строк?
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
29.09.2022, 18:49
Цитата Сообщение от Замабувараев Посмотреть сообщение
То есть ОС должна определять на каком языке написана программа и подсовывать родной для этого языка формат строк?
SetConsoleCP кто придумал?
Переменные вроде $LOCALE кто придумал?
Для чего их придумали, как думаете?
Цитата Сообщение от Замабувараев Посмотреть сообщение
на каком языке написана программа
Локализация это вообще отдельный вопрос. Для вас будет откровением, что программа может работать далеко не на одном, и даже не на двух языках?
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
30.09.2022, 14:34
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
SetConsoleCP кто придумал?
Переменные вроде $LOCALE кто придумал?
Для чего их придумали, как думаете?
Вот вы всё знаете, а разработчики стандартной библиотеки этого не знают и не умеют. Объясните им, чтобы стандартная библиотека под капотом вызывала эти функции и правильно выводила строку на консоль.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
30.09.2022, 15:46
Цитата Сообщение от Замабувараев Посмотреть сообщение
Вот вы всё знаете, а разработчики стандартной библиотеки этого не знают и не умеют. Объясните им, чтобы стандартная библиотека под капотом вызывала эти функции и правильно выводила строку на консоль.
Вы читать вообще-то умеете? Повторяю: кодировки это не задача стандартной библиотеки, она вообще не имеет права кодировку менять.
Так что ваша претензия на самом деле к разработчикам виндовой консоли, которая стандарты не поддерживает.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
01.10.2022, 05:30  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот для этого последний аргумент и используется - для буферизации входной строки между вызовами.
Теперь понятно, грубо говоря, это служебная переменная. Когда строка маленькая это не заметно, но что будет, если текст будет солидного размера, по сути для каждого потока будет выделена память под строку, не многовато ли? Или это такой компромисс между безопасностью данный и расходом памяти... strtok_r - это линуксовая функция я правильно понимаю? в студии не пашет, не находит студия её.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Нет. Если вручную выстраивать потоки последовательно, то толку от них не будет. Достаточно использовать потоко-безопасные функции, то есть те, которые не используют скрытые переменные. Как та же wcstok например.
Я так понимаю это функции с окончанием *_s, если нет, то я чего-то не понимаю. Интересно, а потоко-безопасные функции, как потоки выстраивают, параллельно? Но как, как это под капотом выглядит.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если это у вас используется только ради getch, лучше замените на system("pause");
Да, только ради неё, чтобы лицезреть результат работы программы, можно и system("pause"), но тоже что-то подключать нужно, иначе не компилируется.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Так что да, это вопрос привычки и собственно задачи.
Это облегчает изучение материала, не отвлекает построение интерфейса, но это только моё личное наблюдение, пока занимаешься разработкой GUI отвлекаешься от решения задачи, но это только тогда, когда что-то изучаешь, во всём остальном с графическим интерфейсом удобнее, понятнее.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но по формулировке могу предположить совершенно практическую расшифровку - чтобы текст всегда помещался в окне и был читаем. То есть разбиение на несколько строчек, в том числе когда вы хватаете окно за угол и начинаете его ресайзить. И скорее всего, в winapi какой-то стандартный способ для этого есть.
Изменение размера шрифта вряд ли. Это чит, и я плохо представляю, где бы это пригодилось в реальной жизни.
Да, но во-первых, как его(текст) поместить в окно так чтобы он занимал место от левого верхнего до правого нижнего угла, есть файл в нём текст, как вычислить размер строк так чтобы они были одного размера. В WM_CREATE в начале работы размер окна можно подогнать под вычисленные размеры это не запрещается, но как вычислить ровные размеры строк не знаю. Во-вторых, это про изменение размеров окна, текст должен всегда помещаться в окне, кроме изменения размеров шрифта как этого ещё добиться, возможно, пересчёт размеров строк так, чтобы они вновь стали одинаковой длины, и пометились в окне согласно условию. Хотя я себе это слабо представляю, если изменить размер уменьшить по ширине и высоте, то останутся лишние строки как ни крути. Стандартный способ с WinApi я не нашёл из того материала, что до этого момента изучил точно.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
01.10.2022, 08:02
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Повторяю: кодировки это не задача стандартной библиотеки, она вообще не имеет права кодировку менять.
Имеет.
Любая строка должна иметь формат и определённое устройство. Это же не какой‐то сырой набор байт, который выводится в поток совершенно другой функцией. Для вывода строк на консоль есть специальные функции, которые работают со строками.

Поэтому когда библиотека выводит строку на консоль, она использует функции вывода строки. И строку для таких функций следует подавать в родном для ОС формате, и библиотека должна преобразовать формат си‐строк в родной формат строк для ОС.
По факту это уже происходит. Например, функция WriteConsole ориентируется не на нулевой символ, как это принято в си, а на длину, которую указывают отдельным параметром. Стандартная библиотека вычисляет длину строки и отправляет её в функцию WriteConsole. Первый шаг сделан.

Осталось сделать второй шаг и научить разработчиков библиотеки, что выводить строки можно в юникоде.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
01.10.2022, 10:50
Цитата Сообщение от Liss29 Посмотреть сообщение
Когда строка маленькая это не заметно, но что будет, если текст будет солидного размера, по сути для каждого потока будет выделена память под строку, не многовато ли?
Там не память под строку выделяется, а меняется сама исходная строка и дается указатель на необработанную часть.
Цитата Сообщение от Liss29 Посмотреть сообщение
strtok_r - это линуксовая функция я правильно понимаю?
Честно - не смотрел, просто глянул ман на strtok, а она там упоминалась. Можете переделать мой код на wcstok, она-то у вас должна быть.
Цитата Сообщение от Liss29 Посмотреть сообщение
Да, только ради неё, чтобы лицезреть результат работы программы, можно и system("pause"), но тоже что-то подключать нужно, иначе не компилируется.
man говорит, что <stdlib.h>, уж это могли и сами проверить. system("pause"); это как раз виндовая штука.
Цитата Сообщение от Liss29 Посмотреть сообщение
Да, но во-первых, как его(текст) поместить в окно так чтобы он занимал место от левого верхнего до правого нижнего угла
Первая интерпретация, практическая: аналог massageBox'а, когда ширина окна фиксирована, а высота подгоняется под размер текста.
Вторая интерпретация, практическая: аналог блокнота, когда фиксированы и ширина, и высота, но можно добавить полосы прокрутки.
Третья интерпретация, учебная: фиксированы ширина и высота, но можно менять шрифт так, чтобы текст всегда заполнял все окно.
Цитата Сообщение от Liss29 Посмотреть сообщение
В WM_CREATE в начале работы размер окна можно подогнать под вычисленные размеры
А окно не будет автоматически растягиваться, если в него поместить label и увеличивать длину строки в нем? В gtk работает примерно так.
Цитата Сообщение от Liss29 Посмотреть сообщение
как вычислить ровные размеры строк не знаю
Можно попробовать считерить и использовать моноширинный шрифт, тогда длина строки это всего лишь количество символов умножить на размер.
Если же хотите решить задачу "честно", должны быть функции расчета размера реднера строки. В том же gtk есть функция cairo_text_extents(intr, str, &sizes);, которая для строки str, выводимой ранее указанным шрифтом, считает размеры. В SDL подобным занимаются TTF_SizeText, TTF_SizeUTF8 (font, string, &w, &h);. По идее, подобное должно быть и в других шрифтовых библиотеках.
Но это низкий уровень. Если ваше упражнение рассчитано на использование стандартных виджетов, надо именно их как-то настраивать. Может, у label есть функция автопереноса, может у поля текстового ввода. Как я говорил раньше, с winapi помочь смогу немногим.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Любая строка должна иметь формат и определённое устройство. Это же не какой‐то сырой набор байт, который выводится в поток совершенно другой функцией.
Мы про Си говорим, там строка это именно сырой набор байтов, для которого и типа-то специального нет, а вся работа осуществляется библиотечными функциями.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Для вывода строк на консоль есть специальные функции, которые работают со строками.
И для вывода этого набора байт имеются как простые функции вроде puts или write, которые вообще никаких преобразований не имеют права делать, либо printf, которая потенциально может менять кодировку или локальные настройки (десятичный разделитель, формат даты, ...). Стоп. А я не знаю, меняет ли printf кодировку. Если не указать setlocale, юникод она выводить не будет, то есть что-то она там делает. Но вот как это по-простому проверить, учитывая, что других кодировок у меня, кажется, не установлено?
Цитата Сообщение от Замабувараев Посмотреть сообщение
Стандартная библиотека вычисляет длину строки и отправляет её в функцию WriteConsole.
Ну разумеется, нет. Стандартная библиотека про WriteConsole скорее всего знать не знает. Ей открыли stdin, stdout, stderr, она в них пишет обычным файловым способом. С чем эти файлы ассоциируются - с терминалом, файлом или входом другой программы - ее не волнует.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Осталось сделать второй шаг и научить разработчиков библиотеки, что выводить строки можно в юникоде.
А что они могут сделать, если сам терминал юникод не поддерживает?
Если перенаправить ввод-вывод на обычные файлы, проблем нет. Значит, разработчики про юникод в курсе, и корректно реализовали. Получается, проблема именно в виндовой консоли.
Не поленился, проверил на виртуалке с winXP. Кстати, нашел забавный костыль для вайна. Вероятно, он старательно эмулирует баги виндового терминала, но получается это плохо. Но можно вызвать программу так: cat | wine a.exe | cat, тогда ввод-вывод по сути пробрасывается из виндового терминала в нормальный, и проблем с юникодом не возникает.
Код примера:
C
1
2
3
4
5
6
7
#include <stdio.h>
#include <locale.h>
 
int main(){
  setlocale(LC_ALL, "");
  printf("SomeText\nКакой-то текст\n");
}
Вы часом не знаете, какая утилита в винде является аналогом cat, чтобы повторить фокус как с вайном?
Миниатюры
Вывод информации в файл, Кириллица корректно не выводится  
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
01.10.2022, 12:49
UPD: ого, а в msys2 это работает. Видать, добавили под капотом проверку выходного потока и костыли для обхода багов виндовой консоли.
Замабувараев, видите, сторонние разработчики вынуждены изворачиваться странным образом только чтобы программа в винде работала так, как ожидалось.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
01.10.2022, 21:10
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
а в msys2 это работает
Вот видите, вы сами только что доказали что у вас стандартная библиотека была сломана.
Когда взяли нормальную, то всё заработало.
Так что проблема не в винде.

Добавлено через 7 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы часом не знаете, какая утилита в винде является аналогом cat
В Windows можно использовать команду следующего вида:
Windows Batch file
1
copy /b a.txt + b.txt abc.txt
Для вывода содержания файла на экран используют команду type.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
01.10.2022, 21:28
Цитата Сообщение от Замабувараев Посмотреть сообщение
Вот видите, вы сами только что доказали что у вас стандартная библиотека была сломана.
Я уже спрашивал, умеете ли вы читать. Теперь можно сделать однозначный вывод - не умеете.
Сколько можно повторять: не перекладывайте работу разработчиков консоли на прикладных программистов.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Когда взяли нормальную
Читать как "когда написали нереальное количество костылей", очевидно.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Для вывода содержания файла на экран используют команду type
Она не умеет читать из stdin, я это уже проверил.
Если бы вы умели читать, то увидели бы пример, который я нашел для wine'а: cat | wine a.exe | cat и про аналог которого спрашивал. Но вы не умеете, поэтому приводите какие-то совершенно левые примеры.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2022, 21:28

Кодировка , кириллица не корректно отображается
страницы нормально распознают кирилицу, с базы тоже кирилицу нормально отображает. Вот никак не могу понять при отправке ajax-ом форму...

Не выводится кириллица
Никак не хочет работать кириллица.#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;locale.h&gt; #include...

Не выводится кириллица из БД
не выводится кирилица из БД $mysqli = new mysqli (&quot;localhost&quot;, &quot;root&quot;, &quot;&quot;, &quot;mybasenew&quot;); $mysqli-&gt;query (&quot;SET NAMES 'utf8'&quot;); ...

Не выводится кириллица в консоль
main.c #include &lt;stdlib.h&gt; #include &quot;menu.h&quot; int main(){ menu_item list= {

Кириллица выводится некорректно
Добрый день Друзья! У меня возникла такая проблема надо реализовать в программе на Си чтобы можно было вводить русские буквы и они...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru