Есть ли возможность «встроить» несколько больших .txt файлов в .exe?
Здравствуйте. Я только начинаю изучать программирование и столкнулся с такой, казалось бы, простой задачей, но не могу найти способ ее решения. Нужно как-то встроить тектсовые файлы в выходящий .exe. Программа - это форма WindowsForms под CLR (.net framework) на C++.
На данный момент, для работы проекта необходимо в папку с .exe файлом закинуть четыре .txt файла, что выглядит не вполне эстетично, особенно учитывая, что размер этих файлов суммарно превышает размер .exe . Просто переписать содержимое этих файлов в код не подходит, т.к. есть необходимость в частом и удобном редактировании текста, плюс придется переосмысливать и переписывать механизм работы.
В самом коде идет ссылка на четыре файла .txt, представляющих собой своеобразные словарики с одним словом в каждой строке. Суммарная длина этих файлов где-то в районе 80 тысяч строк. Файлы открываются при помощи std::ifstream, откуда std::getline забирает нужную строку.
Я так понял, что подобное внедрение это делается через ресурсы, однако я абсолютно ничего в этом не понимаю, т.к. в ресурсы еще не погружался. Плюс множество видов ресурсов, их обработки и прочего создает проблемы для ориентации в этом всем. Я обязательно изучу эту тему, но меня смущает, что весь код, по-факту, был написан за 10 минут, а для "Последнего штриха" мне нужно будет изучить огромное количество документации.
Я нагуглил, что как-то можно конвертировать эти файлы в один из видов файла-ресурса при помощи resgen.exe, но после каждого редактирования текстового файла вручную конвертировать файл и перезаписывать имеющийся - дело трудоемкое. Плюс, для меня неясно как потом из файлов ресурса это все доставать.
Мне кажется, что все это может делаеться гораздо проще, в чем, собственно, и заключается суть вопроса: Есть ли возможность как-то на стадии компиляции просто скопировать содержимое этих файлов в некие "Виртуальные/Внутренние" файлы, на которые сможет ссылаться ifstream, либо что-то ему подобное? Либо просто сделать так, чтобы .exe распаковывал своеобразные временные файлы на время работы программы?
galaxy, я думал, что директива #include используется только для хэдеров.
По вашему совету, при попытке просто заинклудить .txt файл выдается ряд ошибок, ссылающихся на файлы .txt:
C2883 - "operator operculum" не является распознаваемым оператором или типом
C2001 - newline в константе
C2632 - недопустимый "double" с последующим "double"
C4430 - отсутствует спецификатор типа - предполагается int.
C2143 - синтаксическая ошибка: отсутствие ";" перед "-"
C2015 - слишком много знаков в константе
E0065- требуется точка с запятой ";"
C5033 - "register" больше не является поддерживаемым классом хранения.
jcmvbkbc, EasyMoney322,
я вроде и не говорил, что надо писать #include "file.txt"
Есть много вариантов разной степени удобности:
1. Перепишите txt файлы в виде
char* data[] = {
"line1",
"line2",
...
}
Это вы имели в виду под усложнением редактирования? Ок, едем дальше
Перепишите txt файлы в виде
…
едем дальше
…
все еще не устраивает?
эти способы не использует директиву #include.
Пишем makefile, который из txt сделает один из предыдущих вариантов и его заинклудим.
Если каким-то промежуточным шагом преобразовывать .txt в С-код, то можно сразу в полноценный самодостаточный исходник, который можно скомпилировать отдельно и никуда не инклудить.
galaxy,
Ну, вы не указали что именно инклудить и поскольку это единственные файлы в обсуждении, я сделал предположение.
В первом случае, предложенным вами, мне придется проставлять ковычки вначале и в конце строки каждый раз. Это так же будет делать превоначальный файл менее читабельным. Плюс некоторые строки содержат символы типа /, ' и ". Плюс я не уверен, что туда поместится все, что нужно. Придется разбивать файлы на части, что вызовет множество неудобств. Я напомню, что суммарно тут 80к строк, неравномерно разбитых на 4 файла.
Во втором случае, программа не компилится даже при подобной конвертации только одного такого файла:
C2026 слишком большая строка, замыкающие знаки сокращены
Хотелось бы редактировать в удобном текстовом редакторе .txt перед компиляцией, а не вылавливать это все в коде.
Вариант с makefile я изучу. По поводу ресурсов: Я думаю, тут и так главное ограничение накладывается тем, что это WinForm.
Меня, просто, не покидает ощущение, что это абсолютно тривиальная проблема и что это делается либо через компановщик, либо средствами IDE, причем в пару кликов или строк, не увелиичивая объем кода.
да придется убрать работу с файлами из кода, ибо лишнее, и такой метод максимально быстрый так как данные доступны сразу при запуске exe, при этом загрузка в память физически произойдет в момент доступа к переменной (в windows exe файл - memory mapped file).