Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2020, 00:54   #1
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию Есть ли в С++ аналог фортрановского оператора format? C++ Fortran Format

Здравствуйте, народ
Передо мной тут встала задачка перевести кое-какие древние программки с Fortran-77 на С++. В принципе ничего слишком сложного нет, но там в них довольно специфический вывод данных в файл, и возможно, придется добиваться его полного соответствия. Вот такой пример, например:

Код:
FORMAT(/I10,5X,4I2,5X,'Q.Fr.      ',6(2I1,' '))
В принципе можно все это выписывать по кусочкам, но это не очень красиво как-то. Роюсь в интернете, есть ли в С++ какой-то аналог оператора format, но пока что-то не нашел.
archerix вне форума Ответить с цитированием
Старый 02.01.2020, 08:58   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

archerix, аналог то есть, но не однозначный http://www.c-cpp.ru/content/printf

или с использованием библиотек
MFC - CString::Format
Qt - QString::arg

но, на мой взгляд, наименее мозгодробительным вариантом будет использовать конвертер (из полученного результата выдрать форматирование). В тырнете множество, вот первый попавшийся
https://en.wikipedia.org/wiki/F2c
Алексей1153 вне форума Ответить с цитированием
Старый 02.01.2020, 12:13   #3
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Что-то не доверяю я автоматике Хотя в данном случае будет интересно посмотреть, что робот напишет про формат

А библиотеки подключать лишние не очень хочется.


З.Ы. Попробовал какой-то автоматический конвертер, он вообще не понял этих форматов Что в принципе логично, если в языках нет прямого аналога.

Последний раз редактировалось archerix; 02.01.2020 в 13:37.
archerix вне форума Ответить с цитированием
Старый 02.01.2020, 12:57   #4
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

А как думает общество, что в принципе проще применить в данном случае? Оператор fprintf или ofstream - там ведь тоже можно вроде задавать формат.

Повторюсь - задача стоит в том, чтобы выдать в файл строку, состоящую из чисел и, возможно, текстовой вставки строго так же, как в оригинале. Надо задать общее число цифр числа и знаки после запятой. Вот пример вывода:
Код:
         9      0 1 0 0     U.St.          13 14 23 24 34 
                1 0 0 0     V.St.          21 
                0 0 0 0     J.             13 14 23 24 34 
                0 0 0 0     K.             32.00000

        20      0 0 0 1     U.St.          12 13 24 34 
                0 0 1 0     V.St.          
                0 0 0 0     J.             
                0 0 0 0     K.              0.00000

Последний раз редактировалось archerix; 02.01.2020 в 13:57.
archerix вне форума Ответить с цитированием
Старый 02.01.2020, 14:40   #5
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,529
По умолчанию

Б.И. Березин, С.Б. Березин. "Начальный курс C и C++". 1999 г.
Страница 250.

Для того, чтобы организовать форматированный ввод и вывод, аналогичный тому, что предоставляют пользователю функции printf () и scanf (), в языке C++ используются два способа.
Первый состоит в применении функций - членов класса ios.
При втором способе употребляется специальный вид функций, называемых манипуляторами (manipulator).

Далее следуют несколько параграфов, посвященных этим вопросам.
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 02.01.2020, 14:44   #6
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,529
По умолчанию

Состояние правил форматного вывода в поток определяется состоянием флагов форматирования потока. В заголовочном файле iostream.h определено следующее перечисление, задающее флаги форматирования:

enum {
...
left = 0x0002 - выравнивание по левому краю
...
uppercase = 0x0200 - выдача в формате xx.xxxx Exx
...
}

Изменить состояние флагов можно функцией: long setf (long flags);
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 02.01.2020, 14:49   #7
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,529
По умолчанию

Для управления форматом выдачи из потока можно использовать специальные функции, называемые манипуляторами. Стандартными манипуляторами, доступ к которым можно получить, подключив файл iomanip.h, являются:

decl - десятичный формат
...
setw (int w) - установить ширину поля выдачи

Можно создать свою собственную функцию-манипулятор.

Для организации обмена с файлами к программе надо подключить файл fstream.h.
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 02.01.2020, 17:01   #8
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Спасибо, изучу

Да, еще забыл написать, что там, где несколько цифр подряд, это вывод массива. В оригинале прямо в операторе вывода, например:

Код:
WRITE(11,2111)N,(VARMX(1,J),J=1,4), ((NGT(LL,MM),MM=1,2),LL=1,INDG)
Но fprintf, насколько понимаю, такое не дает
archerix вне форума Ответить с цитированием
Старый 02.01.2020, 20:49   #9
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Стал делать через поток. Получается хитро на вид, но вроде почти работает. Например:
Код:
out<<"               "<<setw(2);
for (int ii=1;ii<=4; ii++) out<<VARMX[4][ii]<<" ";
out<<"     "<<"K.       "<<ZINF<<endl;
Пока чета не могу понять, как задать аналог 10.5f для fprintf
archerix вне форума Ответить с цитированием
Старый 03.01.2020, 03:19   #10
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Всем спасибо, вопрос решен Конечно, в С++ оно подлиннее выглядит, но в конце концов удалось все это воспроизвести
archerix вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
аналог String.Format/sprintf Пепел Феникса JavaScript, Ajax 1 14.06.2011 09:51
zip format Jelena Помощь студентам 2 04.01.2009 18:26
Format() eda Microsoft Office Excel 6 28.08.2008 11:21
Format malevich Общие вопросы Delphi 5 31.12.2006 00:37