有时,当我打开这样的文件时:
FILE *file = fopen(fname, "wb");
if(!file) printf("Error code: %d\n",ferror(file));
我得到32的结果。这是什么意思?具体来说,对于eMbedded Visual C ++ 4.0
此外,似乎eVC不支持perror / errno :(
答案 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看来你的管子已经坏了