ferror(文件)== 32

时间:2009-01-24 06:47:28

标签: c++ c evc4

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

你应该尝试测试perror所说的错误信息是什么。使用方式如下:

perror("fopen");

它将输出如下消息:

fopen: <error description here>

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

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

编辑:查看GetLastError()FormatMessage(),应该支持它们。 http://msdn.microsoft.com/en-us/library/ms680582(VS.85).aspx也有一个使用示例。虽然您可能需要更换微软的“安全字符串”功能,这些功能与普通C语言相同。 (例如:StringCchPrintf - &gt; _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();

答案 2 :(得分:0)

here看来你的管子已经坏了