c ++ открытый файл с ifstream

0

Мне не удалось открыть файл. Функция 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)

  • 1
    Этот вопрос начался хорошо, потом стало ясно, что вы забыли опубликовать свой тестовый пример. Затем вы добавили очень широкий и субъективный второй вопрос в качестве добавления. Какая.
  • 1
    @LightnessRacesinOrbit: Кроме того, как вы обслуживаете содержимое файла по HTTP как статический веб-сайт? Кроме того, файл содержит код JS - как я могу выполнить Jit и выполнить его асинхронно? Каковы лучшие практики для разработки веб-бизнеса?
Показать ещё 4 комментария
Теги:
file-io
wstring
ifstream

2 ответа

4
Лучший ответ

Ваш вызов 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");
  • 0
    Гамбит, спасибо за быстрый ответ. Да, я хочу добавить .config в конец GetModuleFileName. Полный путь к файлу: X: \ CPP.Lessons \ PluralSight \ PluralSight.Fundamentals \ Debug \ PluralSight.Fundamentals.exe.config. MSDN сказал, что хорошим обработчиком исключений является проверка того, был ли ответ от GetModuleFileName больше 0, это может быть устаревшим. Я проверю это.
4

Возможно, вы ошиблись в расширении файла: L".confg" вместо L".config" как указано комментарием в коде.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню