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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- その他(プログラミング・Web制作) ファイル名の一部をbatで変更したい batファイルを使って、以下のようにファイル名の一部を変更した 3 2023/02/21 20:09
- その他(プログラミング・Web制作) I2C接続のLCDディスプレイを使う 2 2023/05/01 17:15
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/03 13:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
プログラム(C)
-
*をユーザーが入力した数字の数...
-
プログラミング・C言語の配列(...
-
コマンドプロンプトからのEOFの...
-
正負を反転させて出力するプロ...
-
作成したいプルグラムがあります。
-
VBでの日付入力値のフォーマッ...
-
cout関数を使っているのですが...
-
c言語が初心者です。教えていた...
-
C言語でつるかめ算をするにはど...
-
batプログラム上で文字列を入力...
-
C言語の入出力関数の違い
-
エクセルワークシート上で、1、...
-
VisualStudio2019のコードアナ...
-
数値の連続入力終了条件について
-
入力されたとき,何も入力しな...
-
double型が正常に認識されてい...
-
アセンブラ言語CASLIIのプ...
-
C言語 自然数の四則演算 エラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語 逆ピラミッドの作り方
-
double型が正常に認識されてい...
-
ワードで文字を入力する時の変...
-
コマンドプロンプトからのEOFの...
-
Linuxで入力待ちなしkeyread関...
-
scanf が無視されます
-
if文の条件にscanf関数を使うと…?
-
C言語について
-
cout関数を使っているのですが...
-
enterでループ終了
-
"scanf"でエンターで改行させな...
-
C言語でgetchar();が上手く使え...
-
C言語scanf_sで何故か2回入力に...
おすすめ情報