powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вставить текст из файла в строку на этапе компиляции.
25 сообщений из 25, страница 1 из 1
Вставить текст из файла в строку на этапе компиляции.
    #34622596
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не соображу, как это можно сделать? Генерировать дополнительный исходник не хочется.

Понимаю, что надо использовать #include "file.txt", т.к. больше способов нет, но что с ним делать?
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622677
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какова цель этого велосипеда? Что у вас с этом файле, если не секрет?
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622702
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychКакова цель этого велосипеда? Что у вас с этом файле, если не секрет?

readme.txt будет выводиться при -h и ошибках
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622704
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
readme.txt из дистрибутива
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622712
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akhreadme.txt будет выводиться при -h и ошибкахя бы в программе из файла выводил, а файлик в инсталлятор включил
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622763
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас Akhreadme.txt будет выводиться при -h и ошибкахя бы в программе из файла выводил, а файлик в инсталлятор включил
Posted via ActualForum NNTP Server 1.4

Не пойдет. У меня утилитка без всяких привязок.
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622775
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<readme.txt>:
static const std::string help(" ... некий текст ...");
static const std::string err1(" ... текст ошибки1 ...");
...
----
<code.cpp>:
...
#include "readme.txt"
...
? Может классом оформить лучше?
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622820
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychчто-то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<readme.txt>:
static const std::string help(" ... некий текст ...");
static const std::string err1(" ... текст ошибки1 ...");
...
----
<code.cpp>:
...
#include "readme.txt"
...
? Может классом оформить лучше?

Это я сейчас так, временно, сдалал. Но представь себе пользователя, который перед инсталяцией будет читать файла readme.txt:

readme.txt
static const std::string usage = ""
" Используйте тыры пыры\n"
" Надо использовать, типа так:\n"
... ну и т.д.
"";


По первых будет вводить в ступор, что мол не то открыл, во вторых затрудняет чтение, ни и т.д.
И, наконец, мне нравиться такое безобразие.

Необходимо, чтобы текст был "чист".
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622828
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. "не нравиться" ;)
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622929
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh wrote:

> Понимаю, что надо использовать #include "file.txt", т.к. больше способов
> нет, но что с ним делать?
Если программа под винду, почему бы в ресурсы не запихнуть?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622934
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
Akh wrote:

> Понимаю, что надо использовать #include "file.txt", т.к. больше способов
> нет, но что с ним делать?
Если программа под винду, почему бы в ресурсы не запихнуть?
Posted via ActualForum NNTP Server 1.4

Она кросс.
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34622978
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
развлечения с препроцессором? правда, не могу пока представить, как это раскрутить...
может продублировать? отдельно в readme.txt для пользователя, отдельно - в коде тоже самое.
ну или всё-же читать из файла, раз он всё одно есть, стандартными С-функциями...
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34623005
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ежели так
gcc -DSOME_TEXT=`cat readme.txt`
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34623007
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh wrote:

> Она кросс.
Тогда перегнать текст в код (обьявление глобальной const char* переменной),
включить его в программу. Если кросс, то используется GNU make - так что
сделать это можно будет без проблем. Если кросс и Qt - то там тоже ресурсы
есть :) (я, по крайней мере, файл через них в программу запихивал, но там
GUI было). Ну и плюс раньше (ещё в турбо паскале) была хорошая вещь для
этого случая - называлась bin2obj, т.е. перегоняла любой файл в *.obj,
который можно было прилинковать и обращаться к содержимому файла по адресу
в памяти. Сейчас аналогов разве нет?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34623091
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА ежели так
gcc -DSOME_TEXT=`cat readme.txt`

Да это хороший сдвиг. Но, нужно будет заменить переносы строк на \n и что-то подобное придумать для винды.

Т.о. обходимся без дополнительного файла, хотя и требуется отдельный код для каждой платформы, ну, а пользователю удобство чтения коллосальное
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34623147
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
Akh wrote:

> Она кросс.
Тогда перегнать текст в код (обьявление глобальной const char* переменной),
включить его в программу. Если кросс, то используется GNU make - так что
сделать это можно будет без проблем. Если кросс и Qt - то там тоже ресурсы
есть :) (я, по крайней мере, файл через них в программу запихивал, но там
GUI было). Ну и плюс раньше (ещё в турбо паскале) была хорошая вещь для
этого случая - называлась bin2obj, т.е. перегоняла любой файл в *.obj,
который можно было прилинковать и обращаться к содержимому файла по адресу
в памяти. Сейчас аналогов разве нет?
Posted via ActualForum NNTP Server 1.4

Что-то я не догоняю схему. Перегнать текст в код, это я так понимаю - скопировать в исходинк. Но зачем тогда ресурсы и прочее, описанное ниже? Можно обрисовать, что где, чтобы было понятно.

ПС: компиляторы пока такие: linux-gcc, win-vs8.
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34623229
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh wrote:

> Что-то я не догоняю схему. Перегнать текст в код, это я так понимаю -
> скопировать в исходинк. Но зачем тогда ресурсы и прочее, описанное ниже?
> Можно обрисовать, что где, чтобы было понятно.

Вариант 1, Qt 4:
Юзаем ресурсы. создаем qrc файл, включаем его в проект.
Код: plaintext
1.
2.
3.
4.
5.
<RCC>
    <qresource prefix="/" >
        <file>license.txt</file>
    </qresource>
</RCC>
После этого открываем текстовый файл через QFile(":/license.txt"). Я такую
штуку делал, но потом плюнул (хотя работает) и стал класть файлы в папку с
программой.

Вариант 2:
Пишем программу, которая берет исходный файл как инпут, и делает из него то,
что нам надо, как аутпут, т.е. *.cpp или *.c. Например, она может генерить
из исходного *.txt файла массив const char* строк, который можно будет
выводить на экран. Т.е. будет получаться *.cpp файл в духе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#define NUM_STRINGS  123 
const char* [NUM_STRINGS] g_Strings = {
        "asdf",
        "",
....
        ""
}
ИЛи делает массив байт, если включаемый файл (вдруг) бинарный .
Программу - конвертер написать не проблема.

Потом добавляем новый target в Makefile и проблем не будет...
Код: plaintext
1.
2.
license.cpp: license.txt
        text2cpp license.txt license.cpp
Можно, конечно и правила объявить для перевода всех *.txt в *.cpp,
н я бы так не стал делать - ИМХО, юзер должен иметь возможность документ
читать в любимом редакторе.

Касательно вышеприведенного примера с -DSOMETEXT=`cat 123.txt`, то
кая понимаю, кавычки пропущены и будет нечитабельно из-за переходов строк.
Т.е. надо переводить переводы строк в \n и т.д.

Вариант 3:
bin2obj я этим ооочень давно пользовался, и не в курсе, есть ли сейчас
встроенные аналоги. Суть в том, утилита берет исходный файл, и делает из
него *.obj, где содержимое файла доступна как переменная по какому-то
адресу. Линкуем с проекстом, в других местах переменную объявляем как
extern.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34623301
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV wrote:

> Пишем программу, которая берет исходный файл как инпут
Можно это дело на bash'е сделать.
Будет нечто вроде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#!/bin/bash
NUMLINES=`wc -l "$1"`
echo "NUM_LINES = $NUMLINES"
echo "const char* g_Strings[NUM_LINES] = {"
sed 's/^\(.*\)$/\"\1\",/g' $ 1 
echo
echo "};"
Только последнюю запятую надо будет удалить.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34623330
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
...


Вариант 1. Отпадает так как использует примочки компилятора.
Вариант 2. В первом же посте и написал.
Вариант 3. Патформозависимый (у меня на asp10 из bin* только bind).

Если подвести итоги, то существует 3 варианта:
1) Покарежить файл с текстом (структура C).
2) Сгенерить исходник.
3) Сгенерить препроцессорный макрос.

Если лучшего не дано, то думаю, что вариант 3 от blinded наиболее предпочтителен, хотя и придется писать для каждой платформы загрузчик в переменную под встроенные скрипты. Но, в отличии от варинта 2 здесь не надо никакой дополнительной программы, путать директории новыми исходниками, забивать makefile-ы дополнительной информацией (сравните: создание, компиляция, включение и удаление исходника с жесткими путями или же определение макроса. Связность уменьшается на порядки).
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34623363
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА ежели так
gcc -DSOME_TEXT=`cat readme.txt`

С подачи ErV из форума по Unix получилось следующее:
Код: plaintext
1.
g++ c.cpp -DSOME_TEXT="`cat c.cpp | awk '{print "\\"" $0 "\\\\n\\"" }' | tr -d "\n"`"
или такое:
Код: plaintext
1.
g++ c.cpp -DSOME_TEXT="`cat c.cpp | awk 'BEGIN {print "\\""} {print $0 "\\\\n" } END {print "\\""}' | tr -d "\n"`"

:)

На замену символов (двойных кавычек и обратных слешей) можно пока забить.

Осталось зделать под винду.
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34623751
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh wrote:

> 1) Покарежить файл с текстом (структура C).
> 2) Сгенерить исходник.
> 3) Сгенерить препроцессорный макрос.
Я бы исходник сгенерил, так как неизвестно - есть ли у макроса, например
ограничение по длине? (хотя вряд ли, но фиг его знает...). Ну и плюс с
построчным const char* массивом можно красивей выводить текст :).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34624007
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVтак как неизвестно - есть ли у макроса, например
ограничение по длине? (хотя вряд ли, но фиг его знает...).

Сейчас 18килобайт запульнул в линухе, все нормуль, и командная строка даже выдержала.
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34624083
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh wrote:

> Сейчас 18килобайт запульнул в линухе, все нормуль, и командная строка даже
> выдержала.
Вроде бы у меня 32768 байт лимит длина команды. И потом, это только под
линуксом. (как вин к этому отнесется?)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34624091
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
Akh wrote:

> Сейчас 18килобайт запульнул в линухе, все нормуль, и командная строка даже
> выдержала.
Вроде бы у меня 32768 байт лимит длина команды. И потом, это только под
линуксом. (как вин к этому отнесется?)
Posted via ActualForum NNTP Server 1.4

Не знаю, но я как-то не люблю ограничения.
...
Рейтинг: 0 / 0
Вставить текст из файла в строку на этапе компиляции.
    #34624268
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в винде тоже 32к, но там есть страшная приписка

Windows 2000: The maximum length of this string is MAX_PATH characters. (это 260 символов )
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вставить текст из файла в строку на этапе компиляции.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]