Да и нет. Самый простой способ - преобразовать содержимое текстового файла в инициализированный массив.
char data_txt[] = {
'd','a','t','a',' ','g','o','e','s',' ','h','e','r','e', //....
};
Это преобразование легко выполнить с помощью небольшого Perl-скрипта или даже небольшой C-программы.Затем вы компилируете и связываете полученный модуль с вашей программой.
Старая хитрость, облегчающая управление с помощью Makefile, заключается в том, чтобы скрипт преобразовывал свои данные в тело инициализатора.и записать его в файл без объявления окружающих переменных или даже фигурных скобок.Если data.txt
преобразуется в data.inc
, то он используется следующим образом:
char data_txt[] = {
#include "data.inc"
};
Обновление
На многих платформах можно добавлять произвольныеданные в сам исполняемый файл.Хитрость заключается в том, чтобы найти его во время выполнения.На платформах, где это возможно, будет информация заголовка файла для исполняемого файла, которая указывает длину исполняемого образа.Это можно использовать для вычисления смещения для использования с fseek()
после того, как вы открыли исполняемый файл для чтения.Это труднее сделать переносным способом, поскольку может даже оказаться невозможным узнать фактическое имя файла вашего исполняемого образа во время выполнения переносимым способом.(Подсказка, argv[0]
необязательно указывать на реальную программу.)
Если вы не можете избежать вызова fopen()
, то вы все равно можете использовать этот трюк, чтобы сохранить копию содержимого data.txt
, и поместите его обратно в файл во время выполнения.Вы даже можете быть умным и писать файл только в том случае, если он отсутствует ....
Если вы можете отбросить вызов до fopen()
, но при этом все еще нужно FILE *
, указывая на данные, тогда это, вероятно,возможно , если , вы готовы играть быстро и свободно с реализацией вашей библиотеки времени выполнения C на stdio.В GNU-версии libc такие функции, как sprintf()
и sscanf()
, на самом деле реализованы путем создания "достаточно реального" FILE *
, который можно передать в общую реализацию (vfprintf()
и vfscanf()
, IIRC).Этот фальшивый FILE
помечается как буферизованный и указывает его буфер на буфер пользователя.Некоторая магия используется, чтобы убедиться, что остальная часть stdio не делает глупостей.