• ベストアンサー

fgets( ) の返り値は何?

fgets( ) はファイル終端に行くと0を返すらしいけど それ以外の場合は何を返すんですか? if( fgets( buf, 10, fp ) == 0 ) break; のように、fgets( ) の返り値をそのまま使うことはできたけど 試しに、 char ret[255]; ret = fgets(buf, 10, fp); とするとコンパイルエラーでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • madman
  • ベストアンサー率24% (612/2465)
回答No.2

すみません、根本的な回答ではありませんでしたね。 バッファを読み込めた時は、読み込んだバッファの先頭ポインタを返します。 ファイルの終わり(EOF)や失敗した時はNULLを返します。

A__
質問者

お礼

バッファの先頭ポインタを返すんですか。 それでバッファには char* を指定しなくては いけなかったんですね。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.5

> fgets( ) はファイル終端に行くと0を返すらしいけど 既に回答が出ていますが、この表現にちょっと引っかかったので一言。 「0」と「'\0'」と NULL を、混同されていませんか? 大抵の処理系では NULL は 0 としても動きますが、規格上保証されているものではありません。(気の利いたコンパイラなら、警告が出るはずですが…) > if( fgets( buf, 10, fp ) == 0 ) break; ここは、きちんと「if (fgets(buf, 10, fp) == NULL) break; と書きましょう。

すると、全ての回答が全文表示されます。
  • natural
  • ベストアンサー率37% (419/1115)
回答No.4

すみません、madmanさんの御回答にちょっとだけ補足させて下さい。 質問者の方は恐らくretはその文字列領域の先頭アドレスを示す、つまりret自身はchar*扱いだからというつもりで御使用になったのだと思いますが、実はこちらは定数です。 同じchar*でもmadmanさんの示された例では変数領域として用意されていますが、A__さんのお使いになったretはretという文字列領域の先頭アドレス以外とはなり得ない定数なのです。 従って、定数を書き換えることはできませんから勿論コンパイルエラーになるわけです。

A__
質問者

お礼

ありがとうございます。 buf も ret も char[] で宣言していました。

すると、全ての回答が全文表示されます。
  • yuyama
  • ベストアンサー率50% (7/14)
回答No.3

fgets()の返り値は、読込が成功すると、bufのポインタを返します。 ファイルの終端、または失敗した場合、NULLを返します。 ファイルの終端と失敗の区別はfeof()を使うことにより可能です。 if( fgets( buf, 10, fp ) == 0 ) { if( feof( fp ) != 0){ //ファイル終端 }else{ //エラー } }

すると、全ての回答が全文表示されます。
  • madman
  • ベストアンサー率24% (612/2465)
回答No.1

char *fgets(char *s, int size, FILE *stream); ですので、 char *ret; ret = fgets(buf, 10, fp); としてください。

すると、全ての回答が全文表示されます。

関連するQ&A