Sono su Windows XP utilizzando Visual Studio 6 (sì, so che è vecchio) che costruisce/gestisce una DLL C++. Ho riscontrato un problema con fopen in mancanza di aprire un file esistente, restituisce sempre NULL.Perché fopen non riesce ad aprire un file esistente?
ho provato:
- Controllo errno e _doserrno impostando sia a zero e poi il controllo di nuovo, entrambi rimangono a zero, e quindi GetLastError() segnala nessun errore. So che fopen non è obbligato a impostare errno quando incontra un errore secondo uno standard C.
- Hardcoding del percorso del file, che non sono relativi.
- Provato su un'altra macchina per sviluppatori che ha lo stesso risultato.
La cosa davvero strana è che CreateFile funziona e il file può essere letto con ReadFile. Crediamo che questo funzioni in una versione di rilascio, tuttavia stiamo anche osservando un comportamento molto strano in altre aree dell'applicazione e non siamo sicuri se questo è correlato.
Il codice è sotto, non vedo nulla di strano mi sembra abbastanza standard. Il file sorgente non è cambiato da poco meno di mezzo anno.
HRESULT CDataHandler::LoadFile(CStdString szFilePath)
{
//Code
FILE* pFile;
if (NULL == (pFile = fopen(szFilePath.c_str(), "rb")))
{
return S_FALSE;
}
//More code
}
Visual C++ 6 non è realmente C++. Certamente codificare sia C che C++ è privo di senso. Scegli una lingua, sia nei tag che nel codice. –
Oh, e come per la domanda, controlla di avere il permesso di accedere al file. Non deve solo esistere: il tuo programma deve essere in grado di accedervi. –
@Tomalak: Sì, abbiamo capito, VC++ 6.0 non è conforme agli standard. Ma è confuso dire alla gente che non è C++ quando afferma chiaramente di essere. Non è certamente C, quindi qual è l'alternativa? Sono completamente d'accordo sul fatto che codificare C e C++ sia privo di senso. –