Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185

swprintf в MinGW

20.07.2023, 10:51. Показов 5738. Ответов 103
Метки нет (Все метки)

Пишу:

C++
1
2
3
wchar_t s[300];
int i=10;
swprintf(s, 20, "%i",i);
Компилятор показывает ошибку:

invalid conversion from 'int' to 'const wchar_t*' [-fpermissive]|
У ГНУсов сказано:

В Windows эта функция не принимает размер буфера в качестве второго аргумента.
Но если написать без указания размера, как в sprintf, тоже показывает ошибку: вторым аргументом требует size_t.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.07.2023, 10:51
Ответы с готовыми решениями:

Как правильно создать строку, используя swprintf?
Дело в том, что мне нужно записать три числа в строку: double, int и double. Числа такие: 1.1414 4 3.4402 (это примеры, сами числа...

Может ли MinGW x64 компилить приложения x32? Или нужно для этого отдельно ещё MinGW х32 качать?
Просто решил поиграться с CodeLite.

Mingw-w64 MinGW TDM-GCC
Всем привет. Хочу понять, существует ли принципиальная разница между Mingw-w64, MinGW и TDM-GCC? Какие плюсы/минусы у этих трех...

103
29.03.2024, 16:39

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Это UTF-16, я же написал.
notepad++ упал в моих глазах (чуток).
Не поддерживает utf-16 без BOM, :gcray2:

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6278 / 3002 / 1051
Регистрация: 01.06.2021
Сообщений: 11,232
29.03.2024, 18:24
Цитата Сообщение от SmallEvil Посмотреть сообщение
notepad++ упал в моих глазах (чуток).
Не поддерживает utf-16 без BOM
Не только Notepad++, но многие редакторы не поддерживают UTF-16 без BOM, ибо необходимости использования UTF-16 без BOM практически нет. Файл с такой кодировкой столкнется с многими проблемами, вплоть до ложного восприятия некоторыми редакторами файла как UTF-8 (ибо UTF-8, как правило, используется без BOM). Одним словом, UTF-8 BOM и UTF 16 практически никому не нужны. Рекомендуется использовать UTF-8, UTF-16 BOM LE и UTF-16 BOM BE.
И вообще, мне кажется, что для Notepad++ есть плагин для работы с hex, с помощью которого можно убрать BOM.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
29.03.2024, 19:29
Цитата Сообщение от Royal_X Посмотреть сообщение
И вообще, мне кажется, что для Notepad++ есть плагин для работы с hex, с помощью которого можно убрать BOM.
Есть, но он глючный.
А так то я согласен. BOM для UTF-16 - важен.
Но неужели было так сложно добавить ручной выбор UTF без BOM ?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
29.03.2024, 20:16
Цитата Сообщение от DrOffset Посмотреть сообщение
Приду домой еще на Windows 10 проверю.
Проверил, как и обещал. В общем на Windows 10 (Mingw 13.1.0) работает такой код:
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
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
int main() {
    setlocale(LC_ALL, "");
    wchar_t s[100], s1[100], s2[100];
    int pp=125;
 
    FILE *F =fopen("in.txt", "rt, ccs=UNICODE");
    FILE *F1=fopen("out.txt", "w");
 
    fgetws(s, 99, F);
 
    swprintf(s1, 100, L"%i. %ls\n", pp, s);
 
    fputws(s1,F1);
 
    swprintf(s1, 100, L"Тест № %i. %ls\n", pp, s);
    fputws(s1, F1);
 
    fputws(s, F1);
    fputws(L"\n", F1);
 
    pp = pp*2;
 
    fwprintf(F1, L"%i. %ls\n", pp, s);
 
    fclose(F);
    fclose(F1);
 
    return 0;
}
Условия: файл in.txt в кодировке UTF-16LE c BOM (наличие BOM обязательное условие, см. доку ниже по ссылке)
Особенности: из-за setlocale(LC_ALL, ""); в русской винде выходной файл будет в CP1251.

В общем-то все работает как и описано в документации: https://learn.microsoft.com/ru... w=msvc-170

Проверял также в Wine этот код. Там не работает, т.к. поддержка ccs там не реализована.

Добавлено через 8 минут
Также проверил вариант (работает в Windows 10)
C++
1
2
    FILE *F =fopen("in.txt", "rt");
    FILE *F1=fopen("out.txt", "w");
В этом случае входной файл тоже должен быть в cp1251 и io-функции будут преобразовывать в utf-16 неявно.

В общем здесь в любом случае необходимо учитывать влияние setlocale и тщательно изучить документацию перед использованием.
1
 Аватар для COKPOWEHEU
4056 / 2691 / 432
Регистрация: 09.09.2017
Сообщений: 11,989
29.03.2024, 21:17
Цитата Сообщение от DrOffset Посмотреть сообщение
Проверил, как и обещал. В общем на Windows 10
Проверьте еще если все в utf-8. У меня оно так заработало в wine и winXP (более новые винды восстанавливать пока лень). И не лезет всякий антиквариат вроде cp1251.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
29.03.2024, 22:56
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
32
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
int main() {
    wchar_t s[100], s1[100], s2[100];
    int pp=125;
 
    FILE *F =fopen("in.txt", "rt, ccs=UTF-8");
    FILE *F1=fopen("out.txt", "w, ccs=UTF-8");
 
    fgetws(s, 99, F);
 
    swprintf(s1, 100, L"%i. %ls\n", pp, s);
 
    fputws(s1,F1);
 
    swprintf(s1, 100, L"Тест № %i. %ls\n", pp, s);
    fputws(s1, F1);
 
    fputws(s, F1);
    fputws(L"\n", F1);
 
    pp = pp*2;
 
    fwprintf(F1, L"%i. %ls\n", pp, s);
 
    fclose(F);
    fclose(F1);
 
    return 0;
}
Входной файл в UTF-8.
Выходной файл в создается в UTF-8 c BOM.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
30.03.2024, 13:48  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В общем на Windows 10 (Mingw 13.1.0) работает такой код:
Работает. Результат - в ansi.

Цитата Сообщение от DrOffset Посмотреть сообщение
COKPOWEHEU, проверил, вот так работает:
Тоже работает. Результат - в utf-8.

Странная логика: пишем "utf-8" - получаем utf-8", пишем "UNICODE" - получаем ansi...


Об этом чудесном превращении, у Microsoft - ничего, но есть такое:

Не указывайте никакое значение, если требуется использовать кодировку ANSI.
Хотя, у Вас только in.txt открывается в режиме unicode... Вывела с ним же - получается UTF-16 LE.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
30.03.2024, 14:01
Цитата Сообщение от Хатобато Посмотреть сообщение
Странная логика
Абсолютно нет. Вы не правы.

В первом случае я указываю: "читать файл с оглядкой на BOM в Unicode", BOM может быть для Utf-8 или Utf-16.
При чтении будет производиться преобразование в Utf-16 (если оно требуется).
В первом случае на запись же я ничего не указываю, что согласно вашей же цитате будет означать "Пишем в ANSI". ANSI для русской винды - это CP1251 (об этом уже сказано было ранее выше).
При записи будет производиться преобразование Utf-16->ANSI.

Во втором случае я принудительно указал Utf-8 и для входа и для выхода, в этом случае во входном файле наличие BOM не требуется. А выходной файл ожидаемо будет в Utf-8 c BOM. В самой программе мы также получаем Utf-16 как разультат преобразования из Utf-8 при чтении. При записи будет производиться преобразование Utf-16->Utf-8.

Об этом всем написано по ссылке, которую я привел выше.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
30.03.2024, 14:23  [ТС]
Поставила на записи utf-8 - получила utf-8. В общем - понятно: на чтении требуется соответствие формату этого файла, а на записи - желаемое.

"Дурь" тоже записывается.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
30.03.2024, 14:29
Цитата Сообщение от DrOffset Посмотреть сообщение
Об этом всем написано по ссылке, которую я привел выше.
Цитата Сообщение от DrOffset Посмотреть сообщение
словия: файл in.txt в кодировке UTF-16LE c BOM (наличие BOM обязательное условие, см. доку ниже по ссылке)
Но в таблице по ссылке BOM не обязателен, если его нет, выбирается UTF-16LE.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
30.03.2024, 14:30  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В первом случае на запись же я ничего не указываю, что согласно вашей же цитате будет означать "Пишем в ANSI".
У Microsoft описано невнятно: можно понимать разными способами.
Не ожидала, что эти функции осуществляют перекодировку. В принципе, вся задача fgetws - найти конец строки, и считать содержимое до него... А у fputws - записать.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
30.03.2024, 14:39
Цитата Сообщение от Хатобато Посмотреть сообщение
У Microsoft описано невнятно: можно понимать разными способами.
Читать документацию - это тоже скилл, который нужно прокачивать.
Кроме того лучше читать оригинал, а не перевод, чтобы избежать искажения деталей.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Но в таблице
Да, это правда.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
30.03.2024, 14:54

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Кроме того лучше читать оригинал, а не перевод, чтобы избежать искажения деталей.
Потому что в мелкомягких машинный перевод, на русский.
Сразу вспомнился перевод, совсем недавно :
Оригинал :
Remarks
ToolStripItem uses the Text property as the default source for the ToolTip content. Set AutoToolTip to false to use ToolTipText as the source for ToolTip content.

To use this property, you must also set ShowItemToolTips to true.
Перевод, который мне в мозг не влазит никак XD
ToolStripItem использует свойство в Text качестве источника содержимого по умолчанию ToolTip . Задайте значение AutoToolTip , чтобы использовать ToolTipText в качестве источника ToolTip содержимого false.

Чтобы использовать это свойство, необходимо также присвоить значение ShowItemToolTips true.



Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Кроме того лучше читать оригинал, а не перевод
Последний раз, хорошая документация от microsoft, которая была написанна на английском, но человеком и редакторами, как минимум, была в комплекте к 2005 MSVC.
После этого я не видел от microsoft адекватной документации, даже на английском.
1
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
30.03.2024, 15:04  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Читать документацию - это тоже скилл, который нужно прокачивать.
Это - умышленное. Чем специфичнее тема, тем невнятнее описание: настолько, что исчезают названия структур ("буфер", без уточнений), значения констант (и найти их - непросто) и т.п., а описания превращаются в кашу. Таких умышленных тормозов везде много: тут - и глючный софт, и всякие неудобства, нелепости, вынужденные заминки...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
30.03.2024, 15:12
Цитата Сообщение от Хатобато Посмотреть сообщение
Чем специфичнее тема, тем невнятнее описание
Чем специфичнее тема, тем более высокая подготовка нужна для понимания документации. Но к данному случаю это не относится, тут все на поверхности.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
30.03.2024, 15:21  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Чем специфичнее тема, тем более высокая подготовка нужна для понимания документации.
Бывают настолько невнятные описания, что даже непонятно, что речь идёт о вещах, которые знаю и которыми постоянно пользуюсь. С пониманием нормальных текстов, даже по новой теме, проблем не возникает.

Добавлено через 4 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Чем специфичнее тема, тем более высокая подготовка нужна
Человек, который читает описание функции, уже должен всё знать об этой функции, включая структуру, которая там названа буфером? Если он всё это знает, то зачем ему это читать? А тот, кто не знает, не сможет воспользоваться описанием.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
01.04.2024, 05:56  [ТС]
Функция зверски заторможена


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
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
 
{
   setlocale(LC_ALL, "");
 
 
   int t=GetTickCount();
 
 
   FILE *F1=fopen("e:\\txt\\gros_8.txt","rt, ccs=UTF-8");
   FILE *F2=fopen("e:\\txt\\gros_88.txt","w, ccs=UTF-8");
 
//   FILE *F1=fopen("e:\\txt\\gros_8.txt","rt");
//   FILE *F2=fopen("e:\\txt\\gros_88.txt","w");
 
 
 
   int n=0;
 
   while (n<10)
   {
 
 
   while (!feof(F1))
     fputws(fgetws(s,1000,F1),F2);
//   fputs(fgets((char*)s,1000,F1),F2);
 
 
 
   fseek(F1,SEEK_SET,0);
 
    n++;
   }
 
 
  fclose(F1);
  fclose(F2);
 
 
  t=GetTickCount()-t;
 
  F1=fopen("e:\\tst\\tim_test.txt","a+t");
  fprintf(F1,"%i\n",t);
  fclose(F1);
 
 
  return 0;
 
}
Всё закомментированное относится к варианту fputs. А результат - такой:


fgetws-fputws: 2422
fgets-fputs (char*): 797

fread-fwrite: 172
Lazarus: 4359
ABC: 984

Т.е., работает медленнее, чем readln-writeln в pascalabc.net!

Проблема может быть в самих функциях, а может быть в конкретной реализации MinGW.
О том, через какие "тернии" у них реализуется printf, разбирали тут: https://habr.com/ru/articles/438044/



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
#include "libioP.h"
  28 #include <wchar.h>
  29 
  30 wchar_t *
  31 fgetws (wchar_t *buf, int n, FILE *fp)
  32 {
  33   size_t count;
  34   wchar_t *result;
  35   int old_error;
  36   CHECK_FILE (fp, NULL);
  37   if (n <= 0)
  38     return NULL;
  39   if (__glibc_unlikely (n == 1))
  40     {
  41       /* Another irregular case: since we have to store a NUL byte and
  42          there is only room for exactly one byte, we don't have to
  43          read anything.  */
  44       buf[0] = L'\0';
  45       return buf;
  46     }
  47   _IO_acquire_lock (fp);
  48   /* This is very tricky since a file descriptor may be in the
  49      non-blocking mode. The error flag doesn't mean much in this
  50      case. We return an error only when there is a new error. */
  51   old_error = fp->_flags & _IO_ERR_SEEN;
  52   fp->_flags &= ~_IO_ERR_SEEN;
  53   count = _IO_getwline (fp, buf, n - 1, L'\n', 1);
  54   /* If we read in some bytes and errno is EAGAIN, that error will
  55      be reported for next read. */
  56   if (count == 0 || (_IO_ferror_unlocked (fp) && errno != EAGAIN))
  57     result = NULL;
  58   else
  59     {
  60       buf[count] = '\0';
  61       result = buf;
  62     }
  63   fp->_flags |= old_error;
  64   _IO_release_lock (fp);
  65   return result;
  66 }
_IO_getwline не может работать на своих "публичных" fgetc/fgetwc, так как они работают ещё медленнее (в пояснении написано "как будто" - "as if by fgetc").
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
01.04.2024, 13:27
Хатобато, тормоза из-за перекодировки. Уберете перекодировку, уберете тормоза.

И вы совершенно зря приводите примеры статей и кода для *nix систем, этот код не будет иметь ничего общего с реализацией в windows. Windows-реализация испльзует mscrt. Это системная библиотека. И ее исходники недоступны.
Кстати, вы бы об этом знали, если бы изучили данные мной ссылки.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
01.04.2024, 16:57  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Хатобато, тормоза из-за перекодировки. Уберете перекодировку, уберете тормоза.
Для перекодировки - этот метод с fgetws-fputws и ccs. В моём примере кодировка не менялась. И если смена кодировки не нужна, то и нет смысла это использовать.

Цитата Сообщение от DrOffset Посмотреть сообщение
Windows-реализация испльзует mscrt.
Почему же такая медленная? Аналоги даже в "медлительном" .net работают намного быстрее... Где тормоза включены?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.04.2024, 17:12
Цитата Сообщение от Хатобато Посмотреть сообщение
В моём примере кодировка не менялась.
Как же не менялась ?
Из utf8 в utf16 и обратно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.04.2024, 17:12

Как заставить QTCreator при компиляции MinGW применять DLL от MinGW?
Как заставить QTCreator при компиляции MinGW применять DLL от MinGW? компилирую,с смотрю зависимости - Там DLL из директории MSVC2013....

Swprintf - Unhandled page fault on read Access
Из-за некоторых проблем, возникающих только под windows (см. предыдущую тему), пришлось использовать для windows тип wchar_t (строки...

MinGW, при установке ошибка: unpacking mingw-get-0.6.2-mingw32-beta-20131004-1-bin.tar.xz
Добрый день, форумчане! Недавно начал изучать Си, решил попрактиковаться. В качестве компилятора не знал какой выбрать (вообще не знаю,...

Правильное swprintf, правильное wprintf ?
Вродеж бы по ,,инструкции,,.... ..... wchar_t str = L&quot;tanya&quot;; // обозначает, что строка не однобайтная, а двуб ...

Qt 4.8.1 and MinGW 4.7.2
Здравствуйте форумчане! Мучает такой вопрос можно ли прикрутить MinGW 4.7 (с поддержкой С++) к Qt 4.8.1? Если да то как? ЗЫ.На...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru