時々、私がそのようにファイルを開くとき:
FILE *file = fopen(fname, "wb");
if(!file) printf("Error code: %d\n",ferror(file));
32の結果が得られます。これはどういう意味ですか?具体的には、eMbedded Visual C++4.0の場合
また、eVCはperror/errnoをサポートしていないようです:(
ferror() を間違った方法で使用しています: 有効な (null 以外の) ファイルハンドルでのみ機能します。NULL を渡すと (fopen() が失敗した場合)、UB が発生します。これは、ランダムな値を出力することでケースに現れます (NULL ポインター アクセスをトラップしないと、基になるプラットフォームにメモリ保護がないことが示唆されます)。
エラーメッセージが何であるかをテストする必要があります。このように使用します:
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-> _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();