- ベストアンサー
戻り値
Oh-Orangeの回答
★『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』もどうぞ。
関連するQ&A
- 戻り値について
ただ今、c言語の勉強をしている者です。 本を読んでいて分からないところがあったので ご指導して頂ければと書き込みました。 それは、最初と最後のところです。 int main(void) { ・ ・ 処理 ・ ・ return 0; >int main(void) このintというのは 戻り値が整数だと言うことだと思うのですが 戻り値が文字の場合ということも あるということですか? 例えば、 char main(void) ということもあるのでしょうか? また、voidというのは 他の名前にしたらいけないのでしょうか? > return 0; というのは、 正常に終わったら戻り値を0にしろということですか? ご指導して頂ければと思います
- ベストアンサー
- C・C++・C#
- C キャスト方法を教えてください
C言語の初心者なのですが、 int abc(int(*read)(void*, int, int), int size, char* data); ような関数で第1引数の値をキャストするときどうすればよいですか。 int read = (????)NULL; そもそもint(*read)(void*, int, int)ってどういう意味ですか?
- ベストアンサー
- C・C++・C#
- main関数の戻り値について
c言語において、main関数の戻り値は何を意味しているのですか。 また、void型にすれば、main関数の戻り値を書かなくても問題無いでしょうか。 また、関数はreturn文を書かなくても、最後まで処理を実行すると終了するらしいですが、void型にすれば、main関数でreturn文を書かなくても問題無いでしょうか。
- 締切済み
- C・C++・C#
- 戻り値を返す関数の前に(void)を付ける
今日会社で 変数 = (void)戻り値のある関数 #具体的な例としては下記一例を参照 と、ソースで書かれているものがあったのですが、 コメント等では、 「戻り値を明示しないときに(void)を付けて使用する」 と、書いてあります。 戻り値のある関数の前で(void)を付けると、戻り値が明示されなくなるのでしょうか?? または、このような動作にはならないのでしょうか。 自分自身、ソースの内容をうる覚えになっておりますので、 確認をしながらアップしていきたいと思いますので、 宜しくお願い致します。 /*一例*/ ・num1とnum2を足した値を返す int PlusPoint(int num1 , num2); ・PlusPointの値を格納する int Sum ◇ソース◆ #include <stdio.h> #include "Plus.h" int main(void) { int Sum; Sum = (void)PlusPoint; if(Sum == 2) { printf("false"); exit(0); } printf("true"); return 0; } *PlusPoint関数は外部で定義されている *プロトタイプ宣言はPlus.hに定義されいるものとする
- ベストアンサー
- C・C++・C#
- 関数とビット列
C言語勉強中です。下記本から抜粋したものですが、 関数の流れや、1U、~0Uなどの意味がわかりません。 それぞれ関数の中でどのような処理をしているのでしょうか? scanfで正数入力し、print_bitsにnxを渡し、そこのxを1と&して 2進の0か1を表示させるのはなんとなく解るのですが、PCのCPUの ビット数を確認する為?の動きなどがわかりません。 どうか、解説していただける方、よろしくお願いします。 #include <stdio.h> int count_bits(unsigned x) { int count = 0; while (x) { if (x & 1U) { count++; } x >>= 1; } return (count); } int int_bits(void) { return (count_bits(~0U)); } void print_bits(unsigned x) { int i; for (i = int_bits() - 1; i >= 0; i--) { putchar(((x >> i) & 1U) ? '1' : '0'); } } int main(void) { unsigned nx; printf("非負の整数を入力してください:"); scanf("%u", &nx); print_bits(nx); putchar('\n'); return (0); }
- ベストアンサー
- C・C++・C#
- ビット構成について
今、ビットについて勉強しているのですが、わからないところがありますので、質問しました。わかる方がいれば、わかりやすく教えてください。(例として、整数xは10とした場合をしてもらえる助かります。) int count_bits(unsigned x){ int count = 0; while (x){ if (x & 1U) count++; x >>= 1; } return (count); } int int_bits(void){ return (count_bits(~0U)); } void print_bits(unsigned x){ int i; for ( i = int_bits() - 1 ; i >= 0; i--) putchar(((x >> i) & 1U) ? '1' : '0'); } 以上 まず、 int count_bits(unsigned x){ int count = 0; while (x){ if (x & 1U) count++; x >>= 1; } return (count); } についてですが、整数Xを10とした場合、私の考えではcount=2となると思うのですが・・・。 次に int int_bits(void){ return (count_bits(~0U)); } についてなのですが、count_bits関数で整数Xを10とした場合count=2となったあと、int_bits関数では全ビットを1にするということみたいですが、count_bits関数でおこなった作業をどうint_bits関数で処理するのかわかりません。 最後が for文の中の、(i = int_bits() - 1 ; i >= 0; i--) についてですが、整数10のときの i = int_bits() はどうなっているのでしょうか?? わかりにくい質問ですみません。 回答宜しくお願いします。
- ベストアンサー
- C・C++・C#
- 戻り値について
プログラミング初心者です。 よろしくお願いします。 C++を使っています。 早速なのですが、以下にプログラムを記載します。 ◎1---------------------------------------- #include<stdio.h> main() { char ss[256]; gets(ss); puts(ss); } ---------------------------------------- ◎1を実行すると、「型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません」と表示されます。 参考書には、「戻り値のvoidがないと勝手に戻り値の関数をint型と解釈する。関数の宣言と定義が合わないとコンパイル時にエラーとなる」とあったのですが、 ◎2------------------------------------- #include<stdio.h> int main() { char ss[256]; gets(ss); puts(ss); } ------------------------------------- 以上の◎2だと、なぜ実行出来るかよくわかりません。 本当に初心者的な質問ですいませんが、教えていただけると嬉しいです。
- ベストアンサー
- C・C++・C#
- VB 関数
初めまして。 VB初心者なので,簡単な質問なのかしれませんが御願いします。 C言語で, int main (void) 戻り値の型 関数名 戻り値なし と書きますが,これと同じ意味を持つプログラムをVBで書くとどのようになりますか? 関数の作り方がまだわかってないので教えていただけますか? 宜しく御願いします。
- ベストアンサー
- Visual Basic
- 引き数がポインタでない関数の戻り値はなぜint型なのか?
最近、疑問に思っていることがあって質問したいんですが、一般的にc言語 で使われる関数っていうのは、引き数としてポインタをとる関数以外は全て 戻り値はint型なのですがこれはなぜでしょう。私自身の結論としては、も し関数の戻り値がchar型だとしたらchar型で表せる範囲の値は全てasciiコー ドとして使われているので、もしエラーがあって戻り値としてEOF(-1)を返す 際に1byteでは同じビット配列になる255が既に使われていてEOFとして-1を定 義できないために、-1と255が同じビット配列ではない1byte以上のデータ型 つまりint型(たぶん、int型がコンピュータが一番効率良く処理できるデータ型なのでたぶんint型を使ったと思いますが)を使ったのではないかと言う 結論に達したのですがこれは正しいのでしょうか。どなたか御教授お願い致 します。
- ベストアンサー
- C・C++・C#
- 構造体ポインタ、及び、戻り値のあるマクロ関数の作成方法について
●開発環境 [OS] Linux 2.6.9 [コンパイラ] GCC 3.4.6 ●質問 以下のプログラム中のTEST関数を、 マクロ関数(#define)にしたいのですが、 やり方がわかりません。 ご存知の方がいらっしゃいましたら、ご教授願います。 -------------------------------- #include <stdio.h> typedef struct t_str_abc { unsigned int x; unsigned int y; } str_abc; unsigned int TEST( str_abc *kou ); void main(void) { str_abc kouzou; unsigned int ret; kouzou.x = 1; kouzou.y = 2; ret = TEST(&kouzou); printf("ret = %d\n", ret); } unsigned int TEST( str_abc *kou ) { unsigned int state; state = kou->x + kou->y; return state; } --------------------------------
- ベストアンサー
- Linux系OS
お礼
レス遅れて申し訳ありませんでした。read関数についての具体的な解答 ありがとうございました。よく理解出来ました。実は仕事でプログラム言語を 使わなければならなくなり、まだまだ初心者ですが、頑張っていこうと思っています。 今、現在のプログラムは低水準の方を使用しているので、より理解力を深めることが出来るようにしていきたいと思います。本当にありがとうございました。