Как правильно обратиться к ресурсу CSV?
Написал небольшую программку в MFC, она обрабатывает csv файл при помощи библиотеки "rapidcsv":
Сейчас файл "database.csv" загружается из директории где лежит приложение exe:
rapidcsv::Document doc("database.csv", rapidcsv::LabelParams(-1, -1), rapidcsv::SeparatorParams(';'));
Rapidcsv загружает файл так:
void ReadCsv()
{
std::ifstream stream;
stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
stream.open(mPath, std::ios::binary);
ReadCsv(stream);
}
Теперь нужно сделать, чтобы этот "database.csv" был "зашит"/"запакован" в само приложение .exe
Я залил "database.csv" в ресурсы проекта:
В файле rc прошито: IDR_RCDATA1 RT_RCDATA "res\rcdat.bin"
В конструкторе rapidcsv::Document указано что нужно передать binary input stream:
explicit Document(std::istream& pStream,........
Я знаю как это делать из файла, а как из ресурса? С LoadResource нашел такой пример, а вот как из него получить ifstream не могу сообразить. Указатель определил, размер определил. Как дальше выгружать поток чтобы его передать в rapidcsv?
HMODULE handle = GetModuleHandle(NULL);
HRSRC rc = FindResource(handle, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
HGLOBAL rcData = LoadResource(handle, rc);
char* res_data = (char*)LockResource(rcData);
DWORD size1 = SizeofResource(handle, rc);
Ответы (1 шт):
В итоге у меня получился такой код.
Создал бинарный ресурс: IDR_BIN1 BIN "database.csv"
//выгружаем в stream из ресурса
HMODULE handle = GetModuleHandle(NULL);
HRSRC hRes1 = FindResource(handle, MAKEINTRESOURCE(IDR_BIN1), L"BIN");
HGLOBAL hMem = LoadResource(handle, hRes1);
DWORD size1 = SizeofResource(handle, hRes1);
char* res = (char*)LockResource(hMem);
stringstream stream{ string{res, size1 } };
//передаем stream парсеру rapidcsv:
rapidcsv::Document doc2(
stream, rapidcsv::LabelParams(-1, -1), rapidcsv::SeparatorParams(';'));