Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! Решил вывести информацию в файл по нажатии на кнопку "сохранить", но в файл отображается либо кракозябры, либо ничего, если текст на русском.
Вот код той части кода, которая должна выполнить задуманное:
Кликните здесь для просмотра всего текста
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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,...

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

81
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,345
23.09.2022, 09:19 2
Цитата Сообщение от Liss29 Посмотреть сообщение
в каком формате ANSII или UNICODE она попадает в буфер
SendMessageW - прочитает юникод
SendMessageA - прочитает ansi
0
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
23.09.2022, 09:34  [ТС] 3
Цитата Сообщение от Алексей1153 Посмотреть сообщение
SendMessageW - прочитает юникод
SendMessageA - прочитает ansi
Т.е. в данном случает нужно конкретизировать просто SendMessage зло. Получается нужно выбирать SendMessageA?
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
23.09.2022, 09:35 4
В какой кодировке ваш исходный текст и в какой вы открываете файл после записи? Не забывайте, что информация о кодировке в файле не хранится, блокнот ее сам угадывает, но вы ему можете указать и другую (хотя именно на счет блокнота не уверен, это все-таки довольно примитивная программа).
Можете просто вывести байты исходной строки и полученного файла в шестнадцатеричном виде и проверить.
Цитата Сообщение от Liss29 Посмотреть сообщение
Вот код той части кода
Тут, увы, помочь не смогу. Если бы код на Си был, был бы шанс. Впрочем, попробую перевести, вдруг да получится...
Цитата Сообщение от Liss29 Посмотреть сообщение
_stprintf_s(sz, 128, TEXT("%s"), TEXT("["));
Тут имелось в виду что-то вроде snprintf(sz, 128, "%s", "[");? А не проще было sz[0]='['; sz[0]=0;? Или strcpy(sz, "[");, или хотя бы sprintf(sz, "[");
Цитата Сообщение от Liss29 Посмотреть сообщение
_tcstok_s
Судя по msdn, это извращение - аналог strtok / mbstok / wcstok в зависимости от настроек среды. А что, сразу указать кодировку исходника нельзя? Или вообще пользоваться стандартной utf-8 / ascii?
Цитата Сообщение от Liss29 Посмотреть сообщение
TCHAR* chTmp = _tcstok_s(chBuf, TEXT(" ,.;"), &NextToken);
Нормального прототипа для _tcstok_s я не нашел, но если он отображается на wcstok, то последний аргумент это не NextToken, а полуфабрикат строки для извлечения следующих токенов. Не вижу, где оно у вас используется, но название все равно лучше сменить.
Цитата Сообщение от Liss29 Посмотреть сообщение
if(chTmp)
_tcscat_s(sz, 128, TEXT(""));
Э? Тут, наверное, chTmp должен добавляться, а не пустая строка?
Цитата Сообщение от Liss29 Посмотреть сообщение
if (SendMessage(hButtonSex[i], BM_GETCHECK, 0, 0L))
Хорошее название для кнопки
Цитата Сообщение от Liss29 Посмотреть сообщение
Считывая строку из элемента управления "edit" в каком формате ANSII или UNICODE она попадает в буфер?
1. У нее же наверняка есть прототип, где тип возвращаемого значения описан. Хотя если это извращение вроде TCHAR, то, конечно...
2. Вам ничто не мешает вывести шестнадцатеричные коды char'ов оттуда в консоль и проверить.
1
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
23.09.2022, 10:24  [ТС] 5
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В какой кодировке ваш исходный текст и в какой вы открываете файл после записи?
То что советовали в книгах, так и пишу, а именно, пользоваться функциями и типами из tchar.h, соответственно тип объявляется как TCHAR, открываю Notepad++-ом, кодировка установленная в нём по умолчанию(я так понимаю) ansi. Проекты создаю в Visual studio 2019 с параметрами по умолчанию, в кодировке точно ничего не менял.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Тут имелось в виду что-то вроде snprintf(sz, 128, "%s", "[");?
Нет, тут 't' это 'a' или 'w' в зависимости от того установлен unicode в системе или нет, во всяком случае я так полагаю. По поводу форматирования строк, с этим спорить не буду наверняка есть более компактные, читабельные, менее ресурсозатратные, но я пока что делаю так, просто так в книге описано)

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Судя по msdn, это извращение - аналог strtok / mbstok / wcstok в зависимости от настроек среды. А что, сразу указать кодировку исходника нельзя? Или вообще пользоваться стандартной utf-8 / ascii?
Я так понял, что это для универсальности кода, по крайней мере так у Рихтера написано...

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Нормального прототипа для _tcstok_s я не нашел, но если он отображается на wcstok, то последний аргумент это не NextToken, а полуфабрикат строки для извлечения следующих токенов. Не вижу, где оно у вас используется, но название все равно лучше сменить.
Сообщение от Liss29
Он у меня нигде не используется я вообще полагал, что это пустой аргумент, и без него функция работает.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Э? Тут, наверное, chTmp должен добавляться, а не пустая строка?
Нет, здесь всё верно, я хочу добавить пробел между словами, если переменная не 0, то добавляю пробел, иначе, пробел добавлять не нужно.


Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Хорошее название для кнопки
))) Это про пол и не более.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Хотя если это извращение вроде TCHAR, то, конечно...
Это именно оно.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вам ничто не мешает вывести шестнадцатеричные коды char'ов оттуда в консоль и проверить.
Сейчас в файле кое что стало отображаться в удобочитаемом виде, только после полезных данных идёт мусор. Пробовал добавить в конец завершающий нуль, но это ничего не изменило. Вместо SendMessage(...) использую уточнённый вариант SendMessageW(...) вывожу данные в файл с помощью функции fwrite(). Остальной код как и прежде.
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,345
23.09.2022, 10:26 6
Цитата Сообщение от Liss29 Посмотреть сообщение
Получается нужно выбирать SendMessageA?
SendMessage - макрос, раскрывающийся в зависимости от настроек проекта в SendMessageA или SendMessageW

что именно требуется - сам решай
1
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
23.09.2022, 11:16  [ТС] 7
А что если так сделать?
Кликните здесь для просмотра всего текста
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
HANDLE hFile = CreateFile(TEXT("D:\\EmployeeRecords.txt"),
                        GENERIC_READ | GENERIC_WRITE,
                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                        NULL,
                        OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
                    if (hFile == INVALID_HANDLE_VALUE)
                    {
                        MessageBox(NULL,
                            TEXT("Couldn't open file"),
                            TEXT("INVALID_HANDLE_VALUE"), MB_OK);
                        return 0;
                    }
 
                    DWORD lpNumber = 0;
                    if (!WriteFile(hFile, sz, _tcslen(sz) * sizeof(TCHAR), &lpNumber, NULL))
                    {
                        MessageBox(NULL,
                            TEXT("Can't to write in file"),
                            TEXT("ERROR_ALREADY_EXISTS"), MB_OK | MB_RIGHT);
                        CloseHandle(hFile);
                        return 0;
                    }
 
                    if (hFile)
                        CloseHandle(hFile);

Так пишет, но правильно ли это в контексте задачи, хотя, с другой стороны это тоже функции WinApi.

Добавлено через 2 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
SendMessage - макрос, раскрывающийся в зависимости от настроек проекта в SendMessageA или SendMessageW
Это я понял я же выше на этот вопрос ответил. Но всё равно не работает, в смысле уже данные на Русском печатает, но данные выводятся с артифактами т.е. в коне полезных данных идёт хвост мусора.

Добавлено через 23 минуты
По моему всё работает, а как сделать так чтобы функция WriteFile() дописывала данные в конец файла, а не уничтожала прежнюю информацию? SetEndOfFile() почему то не помогает.

С выводом через функции Си всё работает, артефакты более не выводятся.

Добавлено через 13 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
По моему всё работает, а как сделать так чтобы функция WriteFile() дописывала данные в конец файла, а не уничтожала прежнюю информацию? SetEndOfFile() почему то не помогает.
Всё, с этим тоже разобрался.
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,345
23.09.2022, 11:18 8
Liss29,
C++
1
2
3
            std::ofstream file("1.txt", std::ios::app);
            std::string sz="sdfsdfhdfjh";
            file.write(sz.c_str(),sz.size());
0
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
23.09.2022, 12:03  [ТС] 9
Алексей1153,
Что это?! Я полагал, что смешивать коды Си, С++, WinApi - плохой тон. К тому же тут английские буквы, и я пробовал так писать, но получилось никак, так же, если вводил текст на русском, то в фале ничего не было.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
23.09.2022, 12:34 10
Цитата Сообщение от Liss29 Посмотреть сообщение
тут 't' это 'a' или 'w' в зависимости от того установлен unicode в системе или нет
Насколько я понял, оно жестко дефайнится либо в одно, либо в другое в зависимости от того, как у вас настроен компилятор. То есть как оно собралось, так и будет, независимо от того, будете ли вы запускать на других системах. А систем без поддержки юникода сейчас днем с огнем не сыщешь.
Поэтому, на мой взгляд, будет проще сразу пользоваться конкретным вариантом функций и точно знать, что именно используется.
Цитата Сообщение от Liss29 Посмотреть сообщение
Он у меня нигде не используется я вообще полагал, что это пустой аргумент, и без него функция работает.
Сравните поведение strtok и wcstok. В первом случае этого аргумента нет, и "полупереваренная" строка хранится где-то в недрах библиотеки. Во втором - в вашей переменной. Соответственно первый вариант проще, но второй надежнее. Вдруг вы захотите разложить на токены две строки одновременно. Или просто воспользоваться этой функцией из разных потоков.
Цитата Сообщение от Liss29 Посмотреть сообщение
Нет, здесь всё верно, я хочу добавить пробел между словами, если переменная не 0, то добавляю пробел, иначе, пробел добавлять не нужно.
Но пробела там тоже нет. Наверное, форум сожрал.
Цитата Сообщение от Liss29 Посмотреть сообщение
Так пишет, но правильно ли это в контексте задачи
Это уж вам виднее, ваша ведь задача.
Лично я бы не использовал платформо-зависимые функции там, где без этого можно обойтись. То есть для обычных файлов fopen / std::*stream. А вот если хочется странного - работы с блочными устройствами, неблокирующий ввод-вывод и т.д., тогда уже спускаться на уровень операционки. И со строками так же: пока получается обходиться стандартом Си (или С++), лучше так и делать, без всяких strcpy_s и подобных. А когда не получается - оборачивать макросом и описывать явно. Потом, возможно, выносить в слой совместимости.
Цитата Сообщение от Liss29 Посмотреть сообщение
К тому же тут английские буквы, и я пробовал так писать, но получилось никак, так же, если вводил текст на русском, то в фале ничего не было.
Еще раз предлагаю вывести коды символов, чтобы хоть понятно было кто косячит - компилятор, не записывая что сказано, или просмотровщик, не отображая что записано.
Цитата Сообщение от Liss29 Посмотреть сообщение
Я полагал, что смешивать коды Си, С++, WinApi - плохой тон
Смешивать Си и С++ действительно не стоит. По крайней мере пока не сможете внятно обосновать необходимость этого. Но Алексей1153 ведь и привел только пример, вам ничто не мешает переделать его на fopen / fprintf / fclose.
Что до winapi - это ведь не язык как таковой, это набор системных библиотек. Дергать их вы можете из любого языка, хоть из Си, хоть из С++, хоть из Паскаля или Вайтспейса.
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,345
23.09.2022, 13:32 11
Liss29, раздел про C++, при чём тут Си и "смешивать"? Это C++

Цитата Сообщение от Liss29 Посмотреть сообщение
К тому же тут английские буквы
тогда нужно использовать std::wstring - utf16

Добавлено через 4 минуты
только запись будет производиться так
C++
1
2
3
4
if(sz.size())
{
   file.write( (const char*)sz.c_str(), sz.size()*sizeof(sz[0]) );
}
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
23.09.2022, 14:50 12
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Liss29, раздел про C++
ТС создал тему в подразделе winapi, а не в С++, все правильно. И раз уж начал писать на Си, действительно не стоит смешивать.
Правда, я бы и с нестандартными функциями постарался не смешивать - со всеми этими fopen_s, TCHAR и подобным winapi-шным выносом мозга, когда есть функции из стандарта, которые ничуть не хуже.
1
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,345
23.09.2022, 15:32 13
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И раз уж начал писать на Си
с компилятором для C++ не получится писать на Си Это будет C++, а не Си. Никакого смешивания нету. Берём стандартные классы - и вперёд

моё дело - предложить, а там - ТС пусть сам развлекается и баги в программе городит
1
270 / 113 / 18
Регистрация: 26.12.2010
Сообщений: 468
23.09.2022, 15:43 14
Писал уже в другой теме, что желательно конкретизировать, A или W функции используете, и будет все хорошо. TCHAR был нужен во времена 98 винды, сейчас то зачем?
Старайтесь всегда использовать юникод, тогда не будет проблем с иероглифами.
1
COM‐пропагандист
859 / 768 / 147
Регистрация: 18.12.2014
Сообщений: 2,195
Записей в блоге: 4
23.09.2022, 18:08 15
Какой‐то бардак из смеси кодировок и функций.

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

Поэтому чтобы записать байты в файл, вам необходимо все ваши TCHAR и строки преобразовать в массив байт. Обычно для этого используют функцию WideCharToMultiByte. Вы всегда знаете на основании какой кодировки вы преобразуете строку в массив байт. Поэтому первая проблема решена.

Когда вы читаете файл, вы не читаете строки, вы читаете массив байт. Теперь вам необходим понять в какой кодировку эти байт. Можно поступить жестоко и считать, что любой такой массив байт — это кодировка UTF-8, 866, 1251, или определить кодировку каким‐либо способом. Затем из эти байты вам необходимо превратить в строку, например, функцией MultiByteToWideChar. Только после этого вы можете работать со строкой.

В качестве подсказки иногда текстовые редакторы вставляют байты BOM в начало файла, можете ориентироваться на них. Читаете первые два три байта, если они похожи на одно из представлений BOM, то последующие байты будут в определённой кодировке. И байты BOM не являются валидной строкой, так что их в любом случае придётся пропускать.

К кодировке файлов ваших исходных кодов это отношения не имеет.
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
23.09.2022, 19:43 16
Цитата Сообщение от Алексей1153 Посмотреть сообщение
с компилятором для C++ не получится писать на Си
А кто вам сказал, что у ТСа компилятор плюсов? Я в его коде ничего плюсового не увидел.
Ну и в любом случае "программисты на Фортране могут на любом языке писать на Фортране".
Цитата Сообщение от Замабувараев Посмотреть сообщение
Поэтому чтобы записать байты в файл, вам необходимо все ваши TCHAR и строки преобразовать в массив байт.
Или вообще не заморачиваться с winapi-шными функциями и использовать обычные:
char для utf-8. Плюс функции вида mbs*, strcpy, fprintf и т.д. благо большинство ascii-специфичных функций с юникодом работают прекрасно. Да и жесткая юникод-специфика требуется не так уж часто.
wchar_t для utf-32 (хотя, кажется, майкрософты это не осилили, у них utf-16), и тогда fwprintf, wcscpy и прочие wcs*.
Цитата Сообщение от Замабувараев Посмотреть сообщение
К кодировке файлов ваших исходных кодов это отношения не имеет.
Ну как же не имеет. Попробуйте записать fprintf(file, "Привет мир\n"); из исходника в cp1251, а потом читать как юникод. Это если повезет, и компилятор согласится 1251 собирать.
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,345
23.09.2022, 19:54 17
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А кто вам сказал, что у ТСа компилятор плюсов?
тут:
Цитата Сообщение от Liss29 Посмотреть сообщение
и я пробовал так писать, но получилось никак, так же, если вводил текст на русском, то в фале ничего не было.
0
270 / 113 / 18
Регистрация: 26.12.2010
Сообщений: 468
23.09.2022, 19:59 18
Цитата Сообщение от Замабувараев Посмотреть сообщение
TCHAR и вообще строки существуют только для вызова функций, которые работают со строками.
Это понятно, но что будет с юникодной строкой при вызове lstrcatA ? Зачем вообще усложнять, и потом угадывать , если можно просто юзать юникод? Кому нужен сейчас Анси вариант, мы же не в америке живем, и не в 95 году, чтоб экономить каждый байт..
0
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
24.09.2022, 05:55  [ТС] 19
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Поэтому, на мой взгляд, будет проще сразу пользоваться конкретным вариантом функций и точно знать, что именно используется.
Видишь, как получается, у вас у всех(комментирующих) свои взгляды на каждую тему, на каждый вопрос, а как я могу подстроиться сразу под все ваши взгляды я исхожу из того, что читаю на данный момент, пробую, пробую что-то другое и уже потом стараюсь использовать то или иное. Хотя про UNICODE согласен, тоже самое в своей книге говорит Рихтер.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Сравните поведение strtok и wcstok. В первом случае этого аргумента нет, и "полупереваренная" строка хранится где-то в недрах библиотеки. Во втором - в вашей переменной.
Т.е. я не правильно использовал функцию, хотя она правильно отработала - это интересно) Я в каком-то примере подсмотрел использование этой функции, потому что не мог понять, зачем этот третий параметр, и в этом примере эта третья переменная тоже не используется.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но пробела там тоже нет. Наверное, форум сожрал.
Как это нет, есть, просто его нужно разглядеть)

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И со строками так же: пока получается обходиться стандартом Си (или С++), лучше так и делать, без всяких strcpy_s и подобных.
Так то оно так, только, я сейчас WinApi изучаю и там работа, в основном, идёт с функциями WinApi и используются функции Си С++ в книге, которую я сейчас читаю нет, но это и не запрещается. Я же писал, что я использовал std::ifstream С++, но результат был нулевой.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Еще раз предлагаю вывести коды символов, чтобы хоть понятно было кто косячит - компилятор, не записывая что сказано, или просмотровщик, не отображая что записано
В Hiew-е смотрел в Hex режиме в нём тоже показывается бурда, каждый символ занимает один байт так что это ANSI, хотя я об этом говорил, что в Notepad++ установлена кодировка ANSI.
Попробовал вывести в файл символы с помощью fputc() получилось следующее:
Код
[$8=>35=>2]{C6G8=0}{KAH55}[$8=>35=>2]{C6G8=0}{KAH55}[]{}{}
или другой вариант
Код
5B42443843D43E43343543D43E4325D7B41C44343644743843D4307D7B41244B4414484354357D
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Смешивать Си и С++ действительно не стоит. По крайней мере пока не сможете внятно обосновать необходимость этого.
Ну вот о чём и речь.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
вам ничто не мешает переделать его на fopen / fprintf / fclose.
Зачем мне переделывать я и так что-то подобное писал изначально.

Добавлено через 21 минуту
Алексей1153
Цитата Сообщение от Алексей1153 Посмотреть сообщение
с компилятором для C++ не получится писать на Си
В настройках же есть опция Компилировать на Си или что-то похожее.

Цитата Сообщение от Morgot Посмотреть сообщение
Это понятно, но что будет с юникодной строкой при вызове lstrcatA ?
А если IsWindowUnicode() использовать для уточнения, нет?

Цитата Сообщение от Morgot Посмотреть сообщение
Зачем вообще усложнять, и потом угадывать , если можно просто юзать юникод?
Как я понял все эти TCHAR-ы и функции с _t* и вообще подключение заголовочного файла tchat.h это как раз и есть упрощение, нет?! тогда можно писать в начале программы так, как у Рихтера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef UNICODE
    #define UNICODE
#endif
 
 
#ifdef UNICODE
    #ifndef _UNICODE
        #define _UNICODE
    #endif
#endif
 
#ifdef _UNICODE
#define _tWinMain wWinMain
#else
#define _tWinMain WinMain
#endif
Или это тоже не вариант?!
Что-то я до конца понять не могу, всё же сейчас лучше с типом char работать или всё писать с типом wchar_t?

Добавлено через 14 минут
Цитата Сообщение от Замабувараев Посмотреть сообщение
Поэтому чтобы записать байты в файл, вам необходимо все ваши TCHAR и строки преобразовать в массив байт. Обычно для этого используют функцию WideCharToMultiByte.
Пробовал, ничего не получилось. Возможно, плохо пробовал.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
24.09.2022, 10:54 20
Цитата Сообщение от Liss29 Посмотреть сообщение
как я могу подстроиться сразу под все ваши взгляды
Не надо подстраиваться. Надо слушать советы и делать выводы. Что-то игнорировать, что-то подсираивать под себя, что-то уточнять.
Цитата Сообщение от Liss29 Посмотреть сообщение
Т.е. я не правильно использовал функцию, хотя она правильно отработала
Да нет, вы угадали с порядком переменных, но NextToken надо бы переименовать. Это если я сам правильно понял, как оно работает.
Цитата Сообщение от Liss29 Посмотреть сообщение
Как это нет, есть, просто его нужно разглядеть)
На моноширинном шрифте его трудно не заметить.
Цитата Сообщение от Liss29 Посмотреть сообщение
каждый символ занимает один байт так что это ANSI
Плохо помню что такое кодировка ANSI, вроде бы это группа однобайтных кодировок, куда входят и ASCII, и 866, и 1251 и другие.
Цитата Сообщение от Liss29 Посмотреть сообщение
5B42443843D43E43343543D43E4325D7B41C44343644743843D4307D7B41244B4414484354357D
Видимо, я как-то криво скопипастил, поскольку ни во что адекватное оно не расшифровывается: [BD8CФ>C45CФ>C%ЧґD46Dt8CФ0}{A$KDHCT5}
Предыдущее ваше "заклинание" я вообще не понял.
Цитата Сообщение от Liss29 Посмотреть сообщение
А если IsWindowUnicode() использовать для уточнения, нет?
А зачем? Старые ASCII-функции оставлены только для совместимости с доисторическими системами из прошлого тысячелетия.
Цитата Сообщение от Liss29 Посмотреть сообщение
тогда можно писать в начале программы так, как у Рихтера:
И не лень столько писать будет?
Я не знаю что за книгу вы там читаете (в том смысле, что сам ее не читал), но в Си или С++ так не принято. И даже в winapi с их любовью к длинным именам, я такого не видел. Попробуйте поискать образцы кода, написанные разными людьми. Желательно более-менее свежие.
Цитата Сообщение от Liss29 Посмотреть сообщение
Что-то я до конца понять не могу, всё же сейчас лучше с типом char работать или всё писать с типом wchar_t?
Зависит от того, что вам нужно прямо сейчас. Если просто знакомиться с winapi, то используйте то, что тамошние функции понимают.
Если просто ввод-вывод текста без обработки, то utf-8 (char). Ну а если нужна хитрая обработка многоязычных текстов (замена прописных-строчных, проход по буквам, подстроки), то wchar_t. Хотя в винде это не особо поможет, потому что ихний wchar_t вобрал все недостатки utf-8 и utf-32 без видимых преимуществ.
0
24.09.2022, 10:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2022, 10:54
Помогаю со студенческими работами здесь

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

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

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

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

Некорректно выводится кириллица
Написал в Code::Blocks 16.01 хелловорлд(вывод на кириллице) на си, а в консоли непонятные знаки...

Не выводится кириллица в консоль
Всем привет. Работаю в Visual 2010. Проблема в том, что когда пытаюсь вывести русские буквы в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru