Мне не удалось открыть файл. Функция fb.is_Open()
никогда не возвращает true. Только когда я жестко fb.open()
источник данных в fb.open()
он работает.
Я попытался преобразовать его в string
, char
и wstring
без эффекта.
Что мне не хватает? Правильный код был бы фантастическим, но также и объяснением.
Попытка открыть файл с переменной источника данных:
wchar_t dataSource[2048];
DWORD errNum = GetModuleFileName(NULL, dataSource, sizeof(dataSource)); //get current dir.
ifstream fb;
wcscat_s(dataSource, L".confg"); //adds ".config" to get full data Sournce
fb.open(dataSource, ios::in);
if (fb.is_open())
{
//get information
}
fb.close();
Вот некоторые вещи, которые я пытался, которые не сработали: wstring x = dataSource; x.c_str()
char* cnvFileLoc = (char*)malloc(2048);
size_t count;
count = wcstombs_s(&count, cnvFileLoc, 2048, dataSource, 2048);
что работает: fb.open(X:\CPP.Lessons\PluralSight\PluralSight.Fundamentals\Debug\PluralSight.Fundamentals.exe.config, ios :: in)
Ваш вызов GetModuleFileName()
неверен. Последний параметр выражается в символах, а не в байтах, а возвращаемое значение указывает, сколько символов было скопировано:
wchar_t dataSource[2048];
if (GetModuleFileName(NULL, dataSource, 2048) > 0)
{
...
}
Или:
wchar_t dataSource[2048];
if (GetModuleFileName(NULL, dataSource, sizeof(dataSource)/sizeof(dataSource[0])) > 0)
{
...
}
Или:
wchar_t dataSource[2048];
if (GetModuleFileName(NULL, dataSource, _countof(dataSource)) > 0)
{
...
}
Или:
wchar_t dataSource[2048];
if (GetModuleFileName(NULL, dataSource, ARRAYSIZE(dataSource)) > 0)
{
...
}
При этом вы .confg
в конец полного имени файла. Итак, если ваше приложение называется myapp.exe
, вы пытаетесь открыть myapp.exe.confg
. Это то, что вы действительно хотите?
Если да, то убедитесь, что файл .confg
действительно существует, и что ваше приложение имеет разрешение на доступ к нему. CreateFile()
предложит гораздо более полезную информацию об ошибке, чем ifstream
делает.
В противном случае, если файл .confg
находится по крайней мере в той же папке, что и ваше приложение, вам придется вручную удалить часть файла из буфера, а затем подставить в правильное имя файла. Посмотрите на PathRemoveFileSpec()
и PathCombine()
для этого. Или, если файл называется myapp.confg
, посмотрите на PathRenameExtension()
.
Обновление: я только заметил, что ваш код .confg
, но ваш комментарий говорит .config
:
//wcscat_s(dataSource, L".confg");
wcscat_s(dataSource, L".config");
Возможно, вы ошиблись в расширении файла: L".confg"
вместо L".config"
как указано комментарием в коде.