12

fwrite を使用して、次のように言って、ファイルに書き込まれた成功した要素の数を返します。

if (!(fwrite(...))) {
    fprintf(stderr, "Failure");
    //perror(???)  I sometimes see code that says perror here and I don't know 
    //exactly what this does.
}

これは、ファイルへの書き込みが成功したことを確認しますか? 他に気になることはありますか?

ありがとう。

4

5 に答える 5

15

要するに、そうではありません。fwrite正常に書き込まれた要素の数を返します。これを、書き込む予定の要素の数、つまり fwrite の引数に渡した要素の数と照合する必要があります。

あなたが行ったことは、いくつかの要素が書かれていることを確認します。

perrorのリファレンスは次のとおりです。

グローバル変数 errno の値を文字列に解釈し、その文字列を stderr (標準エラー出力ストリーム、通常は画面) に出力し、必要に応じて str で指定されたカスタム メッセージを前に出力します。errno は、ライブラリ関数の呼び出しによって生成された最後のエラーを表す値を持つ整数変数です。perror によって生成されるエラー文字列は、開発中のプラットフォームとコンパイラによって異なります。パラメーター str がヌル ポインターでない場合、str が出力され、その後にコロン (:) とスペースが続きます。次に、str がヌル ポインターであるかどうかにかかわらず、生成されたエラーの説明が出力され、その後に改行文字 ('\n') が続きます。エラーが生成された直後に perror を呼び出す必要があります。そうしないと、他の関数の呼び出しで上書きされる可能性があります。

于 2010-02-24T21:52:46.273 に答える
3

explain_fwrite()から、explain_errno_fwrite、 ... を使用することもできますlibexplain

man ページでは次のように説明されています。

この関数は、システム コールexplain_fwriteによって返されたエラーの説明を取得するために使用されます。fwrite(3)メッセージに含まれる最小値は の値ですがstrerror(errno)通常ははるかにうまく機能し、根本的な原因をより詳細に示します。

errno グローバル変数は、デコードされるエラー値を取得するために使用されます。

この関数は、次の例のような方法で使用することを目的としています (以下のコメントで@puchuが正しく指摘しているように、man ページはここで間違っていました。問題に対処するためにコードを修正しました)。

if (fwrite(ptr, size, nmemb, fp) < nmemb)
{
    fprintf(stderr, "%s\n", explain_fwrite(ptr, size, nmemb, fp));
    exit(EXIT_FAILURE);
}

警告:このメソッドはスレッドセーフではありません。

于 2018-10-15T12:57:43.240 に答える
2

コードがエラーを適切にチェックしない可能性があります。使用する

if (fwrite(ptr, size, num, f) != num) {
    // An error occurred, handle it somehow
}
于 2010-02-24T21:54:30.380 に答える
0

fwrite の Linux man ページから

fread() と fwrite() は、正常に読み書きされたアイテムの数を返します (つまり、文字数ではありません)。エラーが発生した場合、またはファイルの終わりに達した場合、戻り値は短い項目数 (またはゼロ) です。

そのため、期待される戻り値と比較する必要があります。

多くの場合、またはerrnoと等しいかどうかを確認する必要があります。その場合、通常は書き込み要求を再試行する必要がありますが、短い書き込みを適切に処理したい場合もあります。EAGAINEINTR

fwrite の場合、短い書き込み(データ全体が書き込まれていない場所) で、feof() および/または ferror() をチェックして、ストリームが返されているかどうか、ファイルの終わり、PIPE の場合などの EOF を確認できます。閉じられた場合、またはストリームにエラー インデューサ フラグが設定されている場合。

于 2010-02-24T21:57:01.923 に答える
0
STRERROR(3)            FreeBSD Library Functions Manual            STRERROR(3)

NAME
     perror, strerror, strerror_r, sys_errlist, sys_nerr — system error mes‐
     sages

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <stdio.h>

     void
     perror(const char *string);

     ...

DESCRIPTION
     ...

     The perror() function finds the error message corresponding to the cur‐
     rent value of the global variable errno (intro(2)) and writes it, fol‐
     lowed by a newline, to the standard error file descriptor.  If the argu‐
     ment string is non‐NULL and does not point to the null character, this
     string is prepended to the message string and separated from it by a
     colon and space (“: ”); otherwise, only the error message string is
     printed.

...

STANDARDS
     The perror() and strerror() functions conform to ISO/IEC 9899:1999
     (“ISO C99”).  ...
于 2010-02-24T21:57:07.840 に答える