![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
http://oshiete1.goo.ne.jp/qa2846277.html
上のURLのソースについていくつか質問です。
while(!feof(stdin)) {
scanf("%c", &ch);
if(!feof(stdin)) printf("%c", ch);
}
と、書いてありますが、「!feof(stdin)」のようにいきなりエクスクラメーションマー
ク(ビックリマーク)が付いていますが、これはどの様な意味になるのでしょうか?
また、whileでstdinを回しているようですが、stdinはどのタイミングにどの様に入力し
ているのでしょうか?
ANo.4の方がcp.exeというファイル名でこのプログラムをコンパイルしたら、「cp <
infile.txt > outfile.txt」と入力すると、infile.txtの内容をoutfile.txtへコピーで
きると書いてあるのですが「<■■■■■>」のように「<」と「>」のマークでくくって
いるのはどういう意味になるのでしょうか?
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
一応No.2に補足しておきますが、Cの真偽値は真(非0)と偽(0)です。
つまり-1でも2でも0ではないので真になります。たとえばif(feof(stdin))の意味はif(feof(stdin)==1)では間違っており、if(feof(stdin)!=0)が正しい解釈になります。
#実はfeof()がEOFを発見したときに返る値は実装依存なので、前者で書くとEOFを判定できずに思わぬ不具合を引き起こす可能性があります
今回の質問とは直接関係のない蛇足ですが、参考までに。
No.3
- 回答日時:
> scanfって改行されるまで入力される関数
そういうことではありません。scanf()は必ずしも改行(Enterキー)を求めてはいません。
入力元がたまたま標準入力だったら、Enterキーを押すことで
「入力が終わったよ」という印となる、というだけです。
表現を変えると、入力元がたまたま標準入力だったら、
Enterキーを押さないと「入力が終わったよ」という印がわからない、
というだけです。
解答有り難うございます。
では、scanfは、改行を判断材料にしているのではないとすれば、何を判断して入力終了としているのでしょうか?
通常のキーボードからの入力の際は、Enter Keyを押すと、'\n'のあとに、EOFでも付いているのでしょうか?
No.2
- 回答日時:
> ということは、whileやifのように真偽判定をするもので「!x」だけのようになっていたら、「x==0」という意味になるということですか?
!は論理式の否定(NOT)を表す記号です。したがって、xが0(偽)の時!xは1(真)となります。!は論理演算子なので、ifやwhileの中だけではなくて、論理式が書けるところならどこにでも書けます。!feof(stdin)と言う論理式は、feof(stdin)が0のときに真となるので、feof(stdin)==0と同じ意味になります。
> コピー元ファイル名を< >でくくって入力しないとコピーできないのですが、< >ってどういう意味を持っているのでしょうか?
これは、ファイル名を<>でくくっているのではありません。<、>はリダイレクトの記号で、<ファイル名はstdinをファイルにリダイレクトし、>ファイル名はstdoutをこのファイルにリダイレクトします。
詳しくはANo.1さんの示されたURL先に説明があります。
解答有り難うございます。
なるほど、feofは、入力の終わりが来たら真(1)を返すから、ここではfeofが入力の終わりで真を返した際に、whileを終わらせるために!feofとして入力の終わりで偽を返すようにしていたということですか。
そんで、「cp < infile.txt > outfile.txt」は、「<infile.txt」と「>outfile.txt」で一括りということだったんですね。
No.1
- 回答日時:
!feof(stdin)は、feof(stdin)==0と言う意味ですね。
feofはstdinが終りにこれば
stdinという標準入力の終りが来ない限りループを続けるという意味です。
標準入力がコンソールであるならCtrl+Cが押されればそこが終わりとなります。
stdinの処理されるタイミングですが、標準入力がコンソールであれば
初めてscanfが呼び出された時点で入力待機します。その後コンソールで改行が押されたら開業まで処理をします。
Hellow, world![改行]
と改行されれば、そこまでループをまわして文字を読み込んでそのまま出力します。
読み込む文字がなくなったら、またscanfのところで待機します。
これをCtrl+Cなどで終わりであることを指示されるまでループさせます。
標準入力stdinがファイルである場合は、もっと単純でファイルの終端が車で
ファイルの中の文字を読み込んで出力することを繰り返します。
stdin、stdoutはそのソースのページの回答に詳しいものがあります。
feofはこのあたり
http://www9.plala.or.jp/sgwr-t/lib/feof.html
リダイレクトはこのあたり
http://itpro.nikkeibp.co.jp/article/COLUMN/20060 …
>!feof(stdin)は、feof(stdin)==0と言う意味
ということは、whileやifのように真偽判定をするもので「!x」だけのようになっていたら、「x==0」という意味になるということですか?
>ファイルの終端が車でファイルの中の文字を読み込んで出力することを繰り返します。
scanfって改行されるまで入力される関数なので、入力されたファイルの一番最後の行に改行が入ってなかったら、最後の行が入力されない気がするのですが、実際にはきちんとコピーされています。これはいったいどういうことなのでしょうか?
後、コマンドラインでファイルをコピーすることに使う場合、http://oshiete1.goo.ne.jp/qa2846277.htmlのANo.4の人が示しているように、コピー元ファイル名を< >でくくって入力しないとコピーできないのですが、< >ってどういう意味を持っているのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Eclipseコンソール表示を、リセ...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
4桁の数字以外を入力したらエラ...
-
電卓の小数点
-
cout関数を使っているのですが...
-
scanfが2回使えない・・・?;
-
コマンドプロンプトからのEOFの...
-
入力候補を表示させるには・・・?
-
正負を反転させて出力するプロ...
-
キーボードを押すまで処理を中...
-
C言語の制限時間
-
Excel VBAで、Application.Inpu...
-
UWSCで変数をキー入力
-
VB カウントダウンタイマーの作...
-
WindowsでEOF
-
意味のよく分らないソース
-
C言語
-
数字以外が入力されたらエラー...
-
C言語のプログラミングについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
プログラムの実行時に'<'でリダ...
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
scanf が無視されます
-
Excel VBAで、Application.Inpu...
-
Eclipseコンソール表示を、リセ...
-
C言語 逆ピラミッドの作り方
-
プログラミングの問題です 「金...
-
小数か整数かを判定する方法
-
ワードで文字を入力する時の変...
-
"scanf"でエンターで改行させな...
-
java初心者です。入力されたの...
-
cout関数を使っているのですが...
-
EDITコントロールで入力できる...
-
batプログラム上で文字列を入力...
-
C言語scanf_sで何故か2回入力に...
-
コマンドプロンプトからのEOFの...
-
C言語でgetchar();が上手く使え...
おすすめ情報