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 以外の) ファイルハンドルでのみ機能します。NULL を渡すと (fopen() が失敗した場合)、UB が発生します。これは、ランダムな値を出力することでケースに現れます (NULL ポインター アクセスをトラップしないと、基になるプラットフォームにメモリ保護がないことが示唆されます)。

于 2009-01-24T08:49:46.567 に答える
2

エラーメッセージが何であるかをテストする必要があります。このように使用します:

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();
于 2009-01-24T06:52:22.437 に答える