Estoy en Windows XP usando Visual Studio 6 (sí, sé que es viejo) construyendo/manteniendo una DLL de C++. Me encontré con un problema con fopen al no poder abrir un archivo existente, siempre devuelve NULL.¿Por qué no abrirá un archivo que existe?
He intentado:
- Comprobación errno y _doserrno fijando tanto a cero y después de comprobar de nuevo, ambos siguen siendo cero, y por lo tanto GetLastError() indica que no hay errores. Sé que fopen no está obligado a establecer errno cuando encuentra un error de acuerdo con un estándar de C.
- Hardcoding de la ruta del archivo, que no son relativos.
- Probé en otra máquina de desarrollo que tiene el mismo resultado.
Lo realmente extraño es que CreateFile funciona y el archivo se puede leer con ReadFile. Creemos que esto funciona en una compilación de lanzamiento, sin embargo, también estamos viendo un comportamiento muy extraño en otras áreas de la aplicación y no estamos seguros si esto está relacionado.
El código está debajo, no veo nada raro, se ve bastante estándar para mí. El archivo fuente no ha cambiado por menos de medio año.
HRESULT CDataHandler::LoadFile(CStdString szFilePath)
{
//Code
FILE* pFile;
if (NULL == (pFile = fopen(szFilePath.c_str(), "rb")))
{
return S_FALSE;
}
//More code
}
Visual C++ 6 no es realmente C++. Ciertamente etiquetar C y C++ no tiene sentido. Decide un idioma, tanto en tus etiquetas como en tu código. –
Ah, y en cuanto a la pregunta, compruebe que tiene permiso para acceder al archivo. No solo tiene que existir: su programa debe poder acceder a él. –
@Tomalak: Sí, lo tenemos, VC++ 6.0 no cumple con los estándares. Pero es confuso decirle a la gente que no es C++ cuando claramente lo dice. Ciertamente no es C, ¿cuál es la alternativa? Estoy totalmente de acuerdo en que etiquetar tanto C como C++ no tiene sentido. –