「お昼の放送」の思い出

今C言語の勉強を始めたのですが、戻り値の概念がどうしても
わかりません。返すなどの語句とごっちゃになってしまいます。
int read (int fhandle, void *buffer, unsigned int count);
ちなみに上のread関数の場合の戻り値は何になるのでしょうか?

関数を調べても、上の表の見方が全く分からず困っています。
よろしくお願いします。

A 回答 (4件)

★『read』の戻り値は。


・この関数は低水準ですね。
 この関数はディスクからある決まったバイト単位でデータ(ファイル)を読み込みます。
 戻り値は読み込めたバイト数が返されます。あとエラーも返します。
 第3引数の『count』の数が返される(戻り値)の最大値となります。
・小さいファイルの場合は1回で読み込めますが、大きいファイルは数回、または数十回の
 読み込みを繰り返してデータを取得します。
 たとえば、ファイルのサイズが 12345 バイトで第2引数の『buffer』と第3引数の『count』が
 4096 バイトまで読み込める場合は次のようになります。
 (1)read( dp, buff, 4096 );…戻り値は 4096、全体の読み込みサイズは 4096
 (2)read( dp, buff, 4096 );…戻り値は 4096、全体の読み込みサイズは 8192
 (3)read( dp, buff, 4096 );…戻り値は 4096、全体の読み込みサイズは 12288
 (4)read( dp, buff, 4096 );…戻り値は  57、全体の読み込みサイズは 12345
 (5)read( dp, buff, 4096 );…戻り値は  0(これ以上は読み取れなかった、つまり EOF 到達!)
 ※上記はエラーが起きなかった場合です。エラーが起きると -1 が戻り値で返されます。
・あとこの関数は低水準ですのでバッファリングなどの機能はありません。
 これは類似関数に1文字単位(fgetc)、行単位(fgets)などの関数が存在しないということです。
 さらに fgetc、fgets 関数は『read』、『write』などの低水準の関数を内部で呼び出して機能を
 作っています。高水準関数(fputc、fgets)では、バッファリング機能を組み込んで1文字単位、
 行単位などの高度な入出力機能を提供しているのです。
・なお、低水準とはかなりハードウェアや OS に依存している関数群の事です。
 ファイル入出力では『creat』、『open』、『close』、『read』、『write』、『lseek』などが
 あります。これらの関数群は OS に強く依存しますので他の OS への移植性を考える場合には
 利用しない事を強くお勧めします。移植性も考えてのファイル入出力は、高水準関数(fputc、fgets)
 などの関数を利用して下さい。

戻り値とは:
・関数の呼び出し元に関数の処理結果などを返します。
 『戻り値』=『返す』=『リターン』などみんな同じ意味です。
 ただし、『戻す』という表現は、戻り値で『戻す』のか、ポインタを使った引数に『戻す』のかで
 少し違いがあります。基本的に戻り値では1つの値しか返せません。たくさんの情報を返したい場合は
 構造体へのポインタを返したり、エラーなどの情報だけを戻り値に返して残りはポインタを使った引数
 に『戻す』こともあります。この辺は関数マニュアルを参照して下さい。関数によって異なります。
・戻り値の概念としては、関数の処理が正常か、異常かのチェックを行ったり、何かを取得した場合の値
 などを返します。数学でいうと『fx』という関数で数式があり、ある値(引数)を渡すを数式を計算して
 その結果を戻す(戻り値)という概念に似ています。よって、呼び名か『関数』となっているのです。
・以上。おわり。→下の『参考URL』もどうぞ。

参考URL:http://www5c.biglobe.ne.jp/~ecb/c/13_01.html,htt …
    • good
    • 0
この回答へのお礼

レス遅れて申し訳ありませんでした。read関数についての具体的な解答
ありがとうございました。よく理解出来ました。実は仕事でプログラム言語を
使わなければならなくなり、まだまだ初心者ですが、頑張っていこうと思っています。

今、現在のプログラムは低水準の方を使用しているので、より理解力を深めることが出来るようにしていきたいと思います。本当にありがとうございました。

お礼日時:2007/04/16 09:51

「戻り値」というか「返却値」は、関数から呼び出し元に戻るときに返される「値」のことです。

関数の宣言では、値ではなく「型」すなわち「返却値型」を指定します。今回の例では、左端の「int」がそれにあたります。
例えば、read関数の定義が

int read (int fhandle, void *buffer, unsigned int count)
{
 ...
 return 10;
}

のようになっていれば、最初の行の左端の「int」が「返却値型」であり、下から2行目の「10」が「返却値(=戻り値)」です。
呼び出し元で、

result = read(handle, buf, 10);

のような使い方をしていた場合、「返却値」という値がresultに代入されることになります。要するに、read関数が「返却値」を「返した」わけです。
    • good
    • 0
この回答へのお礼

レス遅れて申し訳ありませんでした。返却値や型などの
語句についての疑問がスッキリしました。ありがとうございました。

お礼日時:2007/04/16 09:46

int read (int fhandle, void *buffer, unsigned int count);



この関数内で
return XXX;
と記載してませんか?
XXXがint型の数値で戻り値です。

例えば
単純にa+bをする関数

int keisan(int a, int b)
{
int sum;

sum = a + b;

return sum;
}

この場合の戻り値は sum = a+bの計算結果(int型)
になります
    • good
    • 0
この回答へのお礼

レス遅れて申し訳ありません。
戻り値がどういったものなのか、土日で調べてみました。
stamkmさんの意見と照らし合わせて理解することが出来ました。
ありがとうございました。

お礼日時:2007/04/16 09:45

int型の数値


戻り値を返す必要がなければ
int
じゃなく
void
ってなってると思います。

戻り値はvoidでなければ「返す」ものです。
「返さない」のであればvoidです。

例えば、calc()関数が計算を行い、put()関数がcalc()関数を呼び出して計算結果を出力する場合、
put()関数は計算結果をcalc()関数から「返して」もらわないと、出力する事が出来ません。
だからcalc()関数の戻り値としてintなどを指定します。

関数定義の()内のやつは仮引数。
    • good
    • 0
この回答へのお礼

ありがとうございます。では返すと戻り値はほぼ同一
だと考えて良いのでしょうか?

結局read関数の戻り値が何なのか良く分かりません。

お礼日時:2007/04/13 17:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!