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

swprintf в MinGW

20.07.2023, 10:51. Показов 5753. Ответов 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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
29.03.2024, 12:59
Цитата Сообщение от Хатобато Посмотреть сообщение
utf-16 образовался реверс!
Цитата Сообщение от Хатобато Посмотреть сообщение
utf-16 BE
Windows использует UTF-16 LE.
0
 Аватар для COKPOWEHEU
4057 / 2692 / 432
Регистрация: 09.09.2017
Сообщений: 11,995
29.03.2024, 13:00
Цитата Сообщение от Хатобато Посмотреть сообщение
А если в строку форматирование добавить русский текст, то выводится пустая строка!
Еще интереснее эффект: оно выводит транслитом! Dur` No 125.
Но если ваш код исправить чтобы он хотя бы компилировался:
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(){
  setlocale(LC_ALL, "");
  wchar_t s[100], s1[100], s2[100];
  int pp=125;
   
  FILE *F=fopen("in.txt", "rt");
  FILE *F1=fopen("out.txt", "wt");
   
  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); // Выведено правильно
   
  pp = pp*2;
   
  fwprintf(F1,L"%i. %ls\n",pp,s); // Только цифры
  
  fclose(F);
  fclose(F1);
  
  return 0;
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
$ cat in.txt 
ыыы
$ gcc main.c
$ ./a.out 
$ cat out.txt 
125. ыыы
 
Дурь № 125. ыыы
 
ыыы
250. ыыы
 
$
Без локали выводит так:
Code
1
2
3
4
5
$ ./a.out 
$ cat out.txt 
125. 
Dur` No 125. 
250.
P.S.
Проверил на wine: "Дурь" выводится непонятными вопросиками, текст из файла - правильно.
Проверил на виртуалке с winXP: все выводится правильно.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 13:30  [ТС]
Обнаружилось, что текст считывается нормально (почти), если указать "rb" вместо "rt". А "почти" - потому, что тогда fgetws считывает не строку, а весь текст (надеюсь - в границах указанного буфера). Т.е., в нём уже нет смысла - работает так же, как универсальный fread. Явно, гнусы напортачили с этими unicode-функциями.

Добавлено через 2 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Проверил на wine: "Дурь" выводится непонятными вопросиками, текст из файла - правильно.
Видимо, где-как... У меня, после русских букв, в формате, вся строка исчезает.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
29.03.2024, 13:38
Цитата Сообщение от Хатобато Посмотреть сообщение
Явно, гнусы напортачили с этими unicode-функциями.
Нет, просто в текстовом режиме "юникодные" потоковые функции ввода/вывода транслируют содержимое файла, считая что он в многобайтовой кодировке, а не в юникоде (тыц). Для того, чтоб изменить это поведение для файлов в юникоде, нужно указать флаг ccs при отркрытии (тыц)
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 13:56  [ТС]
"rt, ccs=UTF-16LE" не помогло: кракозябры, и блокнот показывает, что файл - в ansi.
"rt, ccs=UTF-16" - блокнот определят как utf-16 LE, но в тексте- кракозябры.
0
 Аватар для COKPOWEHEU
4057 / 2692 / 432
Регистрация: 09.09.2017
Сообщений: 11,995
29.03.2024, 13:58
Цитата Сообщение от Хатобато Посмотреть сообщение
Обнаружилось, что текст считывается нормально
Вы мой код запускали? Обратили внимание, что там куча исправлений: и "%s" -> "%ls", и locale. Ну и на всякий случай проверьте кодировку исходника, вдруг там не utf-8, а что-то другое.
Цитата Сообщение от Хатобато Посмотреть сообщение
если указать "rb" вместо "rt". А "почти" - потому, что тогда fgetws считывает не строку
Возможно, какой-то косяк с символом перевода строки. При "rt" функции пытаются его привести к внутреннему представлению, при "rb" - нет.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Для того, чтоб изменить это поведение для файлов в юникоде, нужно указать флаг ccs при отркрытии

Очередные костыли для майкрософтовского компилятора что ли?
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 14:06  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Windows использует UTF-16 LE.
В BE - ни реверса, ни нормальных букв.

Добавлено через 5 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы мой код запускали? Обратили внимание, что там куча исправлений: и "%s" -> "%ls", и locale. Ну и на всякий случай проверьте кодировку исходника, вдруг там не utf-8, а что-то другое.
Пока не запускала. А кодировка много раз проверена

Ведь проблема не ограничивается чтением и записью: _swprintf тоже дурит... Наверняка, в этой категории, есть и другие глючащие функции...
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
29.03.2024, 14:13
Цитата Сообщение от Хатобато Посмотреть сообщение
не помогло
Да, я ошибся, этот флаг для ввода вывода обычными функциями (типа fread/fwrite).
Юникодные потоковые функции всегда занимаются перекодировкой в соответствии с глобальной локалью, когда работают с файлом, открытым в текстовом режиме.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
29.03.2024, 14:13
Цитата Сообщение от Хатобато Посмотреть сообщение
В BE - ни реверса, ни нормальных букв.
Еще раз, Windows использует LE.
https://learn.microsoft.com/en... e-standard
UTF-16LE 16 bits Little-endian 2-4 bytes (16-32 bits) Default encoding for Windows.
У вас входной файл, из которого читаете, должен быть в UTF16 LE.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 14:23  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
У вас входной файл, из которого читаете, должен быть в UTF16 LE.
В LE, кракозябры...Всё уже перепробовано: и LE, и BE! Почему-то работает только UTF-8. Но если выводить данные от WinAPI через что-то типа fwrite, то будет UTF-16
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
29.03.2024, 14:27
Хатобато, только что взял код из поста №22 (поменял только rt на rb), дал ему на вход in.txt в кодировке UTF-16LE, получил абсолютно понятный и читаемый out.txt в UTF-16LE. Что в fedora на wine, что в windows 7 mingw.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 14:29  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Юникодные потоковые функции всегда занимаются перекодировкой в соответствии с глобальной локалью, когда работают с файлом, открытым в текстовом режиме
Ушли от кодовой страницы, и пришли к локали. Вроде бы, с unicode все подобные проблемы должны были отпасть, в чём и состояла задумка.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
29.03.2024, 14:31
Вот код:
Кликните здесь для просмотра всего текста
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(){
  setlocale(LC_ALL, "");
  wchar_t s[100], s1[100], s2[100];
  int pp=125;
 
  FILE *F =fopen("in.txt", "rb");
  FILE *F1=fopen("out.txt", "wb");
 
  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); // Выведено правильно
 
  pp = pp*2;
 
  fwprintf(F1,L"%i. %ls\n",pp,s); // Только цифры
 
  fclose(F);
  fclose(F1);
 
  return 0;
}


Вот файл входной:
in.txt

Вот файл выходной:
out.txt

Вот экзешник:
a.zip
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 14:36  [ТС]
DrOffset, а у меня - не так.

Поставила

setlocale(LC_ALL, "");
....
fwprintf(F1,L"%i. %ls\n",pp,s);
Бесполезно... fwprintf уже предназначена для unicode, поэтому вряд ли что-то даст явное указание. Если s - в ansi, то просто не компилируется.

Про "rb" - достаточно прочитать в этом режиме, и всё остальное будет нормально. Только читает она уже не строку...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
29.03.2024, 14:40
Цитата Сообщение от Хатобато Посмотреть сообщение
а у меня - не так.
Значит продолжайте искать проблему у себя. У меня теория с практикой согласуется. Я никаких лишних действий не делал, только нужные, и сразу все получилось. Может и вам надо взять паузу и начать с начала, но уже с толком и без танцев с бубном.
PS. Приду домой еще на Windows 10 проверю.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
29.03.2024, 15:17  [ТС]
Вот это работает. Читается в текстовом, а пишется в бинарном

C++
1
fgets((char*)s,999,F);
Это уже чётко: напортачили....
0
 Аватар для COKPOWEHEU
4057 / 2692 / 432
Регистрация: 09.09.2017
Сообщений: 11,995
29.03.2024, 15:24
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот файл входной:
Code
1
@825B
А чего вы туда какие-то кракозябры записали вместо осмысленного текста? Такое ощущение, что он вообще не в utf-8.
Изображения
 
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
29.03.2024, 15:32
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А чего вы туда какие-то кракозябры записали вместо осмысленного текста?
Это UTF-16, я же написал.
0
 Аватар для COKPOWEHEU
4057 / 2692 / 432
Регистрация: 09.09.2017
Сообщений: 11,995
29.03.2024, 15:40
Кто ж тексты в utf-16 хранит!
0
29.03.2024, 15:42

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Кто ж тексты в utf-16 хранит!
О нет, это без меня. Я не виноват, что вы контекст моих ответов не отслеживали.
Не надо мне тут вашу логику подмешивать.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.03.2024, 15:42

Как заставить 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? Если да то как? ЗЫ.На...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru