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

swprintf в MinGW

20.07.2023, 10:51. Показов 5726. Ответов 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
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
01.04.2024, 17:19  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SmallEvil Посмотреть сообщение
Как же не менялась ?
Из utf8 в utf16 и обратно.
Я говорю о последнем примере, в котором тестировалась скорость.

Цитата Сообщение от Хатобато Посмотреть сообщение
C
1
2
FILE *F1=fopen("e:\\txt\\gros_8.txt","rt, ccs=UTF-8");
   FILE *F2=fopen("e:\\txt\\gros_88.txt","w, ccs=UTF-8");
Оба файла - в UTF-8.

Вряд ли для функций стандартной библиотеки используют WinAPI. Функции fread-fwrite работают быстрее ReadFile - WriteFile, поэтому не могут быть основаны на них.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
01.04.2024, 17:31
Цитата Сообщение от Хатобато Посмотреть сообщение
Функции fread-fwrite работают быстрее ReadFile - WriteFile
А вы это измеряли предварительно отключив буферизацию? https://en.cppreference.com/w/c/io/setvbuf
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.04.2024, 17:51
Цитата Сообщение от Хатобато Посмотреть сообщение
Оба файла - в UTF-8.
Но читаются они то в строку формата UTF-16.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
01.04.2024, 18:35  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
А вы это измеряли предварительно отключив буферизацию?
Нет. А зачем?
Почему-то не работает:

C++
1
setvbuf(F1,s,_IOLBF,sizeof(s));
error: expected primary-expression before ',' token

Добавлено через 6 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
Но читаются они то в строку формата UTF-16.
Вроде бы, "строка" - просто некий кусок памяти, а остальное зависит от того, какой тип данных в ней подразумевать. От того, каким типом она объявлена, зависит её величина.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.04.2024, 18:40
Цитата Сообщение от Хатобато Посмотреть сообщение
Вроде бы, "строка" - просто некий кусок памяти
Конечно же нет.

Добавлено через 2 минуты
"Кусок памяти" - это область памяти.
Если мы говорим про строку, то она имеет ряд свойств и параметров.
Широкие строки в ОС windows используют кодировку UTF16 и функции работы с такими строками тоже это учитывают.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
01.04.2024, 18:46
Цитата Сообщение от Хатобато Посмотреть сообщение
Нет. А зачем?
Чтобы подобных утверждений не делать:
Функции fread-fwrite работают быстрее ReadFile - WriteFile, поэтому не могут быть основаны на них.
Для чего по-вашему нужна буферизация?
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
01.04.2024, 18:48  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Широкие строки в ОС windows используют кодировку UTF16 и функции работы с такими строками тоже это учитывают.
Двойной тормоз: из utf-8 - в utf-16, а потом обратно...


fputs(fgets((char*)s,1000,F1),F2);
Здесь этого не происходит (поэтому 797 вместо 2422), но всё работает корректно.

И fread-fwrite этот тип безразличен. Проблема - лишь в том, что не определяет конец строки.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.04.2024, 18:54
Цитата Сообщение от Хатобато Посмотреть сообщение
Здесь этого не происходит (поэтому 797 вместо 2422), но всё работает корректно.
Что работает ?

Добавлено через 3 минуты
Цитата Сообщение от Хатобато Посмотреть сообщение
Здесь этого не происходит (поэтому 797 вместо 2422), но всё работает корректно.
Читая в буффер char*, вы игнорируете то что файл открыт в utf8, и считываете его как будто бы он в однобайтной кодировке.
То есть, плюнули на фсё, сделали лабуду, и довольные.
По мне так вы полной херней маетесь.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
01.04.2024, 18:58  [ТС]
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
char s[20004];
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
 
 
 
{
 
 
setlocale(LC_ALL, "");
 
 long 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","r");
   FILE *F2=fopen("e:\\txt\\gros_88.txt","w");
 
 
 
   int n=0;
 
   while (n<1)
   {
 
 
   while (!feof(F1))
 
//     fputws(fgetws(s,1000,F1),F2);
//   fputs(fgets((char*)s,1000,F1),F2);
 
{fread(s,sizeof(char),20000,F1);
fwrite(s,sizeof(char),20000,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;
 
}
Входной - utf-8. Какой формат ожидаете на выходе?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.04.2024, 19:00
Цитата Сообщение от Хатобато Посмотреть сообщение
fread
это функция бинарной обработки, ему без разницы что там за данные, он читает байты.
Ни про какие UTF8 и прочую ересь не может быть и речи.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
01.04.2024, 19:12  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
По мне так вы полной херней маетесь.
Работает корректно, как и должно быть. При этом - намного быстрее.

кстати, подозреваю, что управление буферизацией умышленно отключили, ради тех же тормозов

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ни про какие UTF8 и прочую ересь не может быть и речи.
fgets - так же, только находит конец строки, с чем, видимо, и связаны небольшие затраты времени.

Добавлено через 6 минут
Цитата Сообщение от zayats80888 Посмотреть сообщение
Для чего по-вашему нужна буферизация?
Что Вы хотите доказать путём отключения буферизации?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.04.2024, 19:16
Цитата Сообщение от Хатобато Посмотреть сообщение
Работает корректно, как и должно быть. При этом - намного быстрее.
Вы сравниваете теплой с круглым.
Те функции которые вы сравниваете имеют разное назначение.
То есть :
Цитата Сообщение от SmallEvil Посмотреть сообщение
вы полной херней маетесь.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
01.04.2024, 19:18
Цитата Сообщение от Хатобато Посмотреть сообщение
кстати, подозреваю, что управление буферизацией умышленно отключили, ради тех же тормозов
Перестаньте пожалуйста приплетать сюда эту конспирологию. Здесь технический форум и ваши проблемы от пробелов в технической части. Других причин нет.

Цитата Сообщение от Хатобато Посмотреть сообщение
При этом - намного быстрее.
Я об этом сразу сказал:
Цитата Сообщение от DrOffset Посмотреть сообщение
Уберете перекодировку, уберете тормоза.
0
2 / 2 / 0
Регистрация: 26.07.2015
Сообщений: 185
01.04.2024, 20:18  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Уберете перекодировку, уберете тормоза.
Наверное, стоило это высказать более чётко: "не используйте эти функции, если не требуется перекодировка".

Добавлено через 4 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Те функции которые вы сравниваете имеют разное назначение.
И fgets-fputs, и fgetws-fputws предназначены для ввода и вывода строк. И ещё сказано, что fgetws-fputws предназначены для широких строк (похоже, тут выяснили, что это - не совсем так).

Добавлено через 44 минуты
Если текст в файле - в utf-16, его можно отобразить без проблем

C++
1
2
3
4
5
wchar_t s[501];
 
FILE *F1=fopen("e:\\txt\\gros_16.txt","rt");
fgets((char*)s,500,F1);
MessageBoxW(0,s,L"",0);
Если он - в utf-8 - потребуется перекодировка (и это будет медленнее)

C++
1
2
3
4
wchar_t s[501];
FILE *F1=fopen("e:\\txt\\gros_8.txt","rt, ccs=UTF-8");
fgetws(s,500,F1);
MessageBoxW(0,s,L"",0);
Утверждение "функции предназначены для перекодировки" - верное.
Думается, теперь - всё очень чётко...


DrOffset - спасибо! Помогли разобраться.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
01.04.2024, 20:34
Цитата Сообщение от Хатобато Посмотреть сообщение
стоило это высказать более чётко
Если вы вспомните, я вам еще на первых страницах советовал использовать UTF-16. Также скинул кучу материала, где я объяснял природу юникода в Windows.

Цитата Сообщение от Хатобато Посмотреть сообщение
Помогли разобраться.
Пожалуйста.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.04.2024, 21:24
Цитата Сообщение от Хатобато Посмотреть сообщение
Если текст в файле - в utf-16, его можно отобразить без проблем
C++
1
2
3
4
wchar_t s[501];
FILE *F1=fopen("e:\\txt\\gros_16.txt","rt");
fgets((char*)s,500,F1);
MessageBoxW(0,s,L"",0);
И ... это неверно!
Цитата Сообщение от Хатобато Посмотреть сообщение
Помогли разобраться.
Сомневаюсь, что вы разобрались.
0
 Аватар для COKPOWEHEU
4056 / 2691 / 432
Регистрация: 09.09.2017
Сообщений: 11,985
02.04.2024, 07:02
Кто-нибудь может объяснить зачем ТС возится с экзотической кодировкой и чего хочет добиться? Ну в смысле что мешает пользоваться обычной utf-8?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
02.04.2024, 11:47
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ну в смысле что мешает пользоваться обычной utf-8?
В файлах или в приложении ?
0
 Аватар для COKPOWEHEU
4056 / 2691 / 432
Регистрация: 09.09.2017
Сообщений: 11,985
02.04.2024, 13:04
Цитата Сообщение от SmallEvil Посмотреть сообщение
В файлах или в приложении ?
В первую очередь в файлах, тем более что текстовые файлы и так почти всегда сейчас в utf-8.
А что до приложений - смотреть по задаче. Если обработка не планируется (считать строки, вывести строки или там локализация) проще в том же utf-8. Но если нужна хитрая обработка (подсчет количества символов, замена одних на другие, поиск символа по положению на экране) удобнее будет utf-32 (wchar_t).
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
02.04.2024, 13:25
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В первую очередь в файлах, тем более что текстовые файлы и так почти всегда сейчас в utf-8.
А что до приложений - смотреть по задаче.
Всё так.

Что до ТС. Мне все его действия не понятны.

Добавлено через 2 минуты
Хочется добавить, что для временных файлов нет нужды кодировать в utf8.
Проще сразу писать внутренние представления строк.

Что до строк в приложении, на это ещё влияет среда разработки (ОС), фреймворк(и) и немного используемые библиотеки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.04.2024, 13:25
Помогаю со студенческими работами здесь

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
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
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru