2014-07-11 2 views
0

У меня проблема с fopen в моем проекте на C++. Я открываю двоичный файл для записи, как выглядит следующим образом:fopen throwing Ошибка неправильного аргумента

wwBool myClass::Open(char* pFileName) 
{ 
    m_pfileHandle = fopen(pFileName, "wb"); 
} 

pFileName обычно содержит строку, как .\data\filename.ext. Тем не менее, я получаю ошибку Invalid Argument.

Если я ставлю имя файла вручную в string buffer и передать его fopen, как показано ниже:

wwBool myClass::Open(char* pFileName){ 

    char tempFile[MAX_PATH]; 
    wsprintf(tempFile, "%s", ".\\data\\filename.ext"); 

    m_pfileHandle = fopen(tempFile, "wb"); 
} 

он может открыть файл для записи.

Что я делаю неправильно?

+0

fopen in C++ ??? \ – nobalG

+0

Можете ли вы опубликовать полный скомпилируемый пример того, как это происходит неправильно? –

+0

Это в Windows и C++. Это большой проект, поэтому не уверен, как опубликовать компилируемый фрагмент кода. – Pixelord

ответ

1

Прочитано fopen, _wfopen пояснение в MSDN тщательно.

fopen используется только с поддержкой Unicode, не включенной для проекта при компиляции. fopen автоматически заменяется _wfopen с поддержкой Unicode, что означает, что макрос препроцессора _UNICODE определен.

_wfopen требуется постоянная широкая символьная строка для имени файла вместо строки с постоянным символом.

Изменение кода

wwBool myClass::Open(char* pFileName) 

в

wwBool myClass::Open(LPCTSTR pFileName) 

См Windows Data Types для описания LPCTSTR.

Конечно с этим изменением Вызывающих процедуры должны передать указатель на wchar_t строки вместо строки char или unsigned char который не является проблемой, если вызывающие процедуры использовать также Windows Data Types for Strings и не основные типов данных.

+0

Ваша дискуссия также очень полезна и актуальна! – Pixelord

+0

Это было полезно для меня. Я НЕНАВИЖУ 'LPCTSTR', но, полагаю, мне придется либо с этим справиться, либо конвертировать его. – cybermonkey

Смежные вопросы