0

有时,当我像这样打开文件时:

FILE *file = fopen(fname, "wb");
if(!file) printf("Error code: %d\n",ferror(file));

我得到 32 的结果。这是什么意思?具体来说,对于 eMbedded Visual C++ 4.0

此外,eVC 似乎不支持 perror/errno :(

4

3 回答 3

6

您以错误的方式使用 ferror() :它仅适用于有效(非空)文件句柄。将其传递为 NULL(在 fopen() 失败的情况下)会导致 UB,这在您的情况下通过打印随机值来体现(不捕获 NULL 指针访问表明底层平台没有内存保护)。

于 2009-01-24T08:49:46.567 回答
2

您应该尝试测试 perror 所说的错误消息是什么。像这样使用:

perror("fopen");

它将输出如下消息:

fopen: <error description here>

我想,由于您在文件对象为 NULL 时使用 ferror,因此错误 32 只是随机垃圾,正如另一个帖子提到的那样,可能缺少 NULL 指针捕获。使用 errno/perror 获取阻止您打开文件的错误。实际上,将 NULL 指针传递给 ferror 是非法的。

编辑:我发现该编译器不支持 perror 和 errno 令人惊讶。我建议您找到正确的错误检测功能并使用它。在这种情况下肯定不是ferror。

编辑:查看GetLastError()FormatMessage(),应该支持它们。http://msdn.microsoft.com/en-us/library/ms680582(VS.85).aspx也有一个使用示例。尽管您可能需要替换普通 C 函数的微软“安全字符串”函数。(例如:StringCchPrintf -> _snprintf/sprintf)

一点谷歌搜索表明这可能对你有用。这不是我的代码,但看起来很合理:

// OS provides a system error string
DWORD dwError = GetLastError();
CString csDescription;
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL, dwError, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
    csDescription.GetBuffer(255), nSize, NULL );
csDescription.ReleaseBuffer();
于 2009-01-24T06:52:22.437 回答
0

从这里看起来你的管道坏了

于 2013-06-13T19:23:57.387 回答