EOF

解決


亜衣  2002-11-05 23:07:12  No: 50542  IP: [192.*.*.*]

プログラミング言語C第2版(B.W.カーニハン/D.M.リッチー著)という本が良いといわれて、勉強しているのですが、最初のほうでEOFを含んでいるプログラム例をそのまま記述しても上手くいかないのですが、同じ本をお持ちの方どうしてなのかわかりませんか。教えてください。

編集 削除
YuO  2002-11-06 00:02:28  No: 50543  IP: [192.*.*.*]

・上手くいかない,というのはどのような状況なのですか?
(コンパイルエラー,予想されたように出力されないetc.)
・また,どのプログラムを記述したのでしょう。
(1.5.1 ファイルの複写の最初のプログラム(p.20) etc.)

これらの情報が無いと,教えようがありませんよ。
このような掲示板や,同じ様な役割のMailing List等では,「上手くいかない」は禁句だと思ってください。
「上手くいく」がどういうことか,説明がなされないと相手にはわからないからです。

[参考] 質問の仕方に関して
http://www.hyuki.com/writing/techask.html
↑これはMailing Listでのマナーですが,掲示板でもほぼそのまま使えます。

編集 削除
特命  2002-11-06 19:06:46  No: 50544  IP: [192.*.*.*]

本は待ってないけど。

コンパイルエラーだとすると、もしかして
EOF は表記上存在するだけで、ソースに書かなくても良いのでは?
ご丁寧に行番号まで振ってもいても行番号は書いちゃいけませんし。

それともファイル処理で_eof絡みかな?

編集 削除
YuO  2002-11-06 20:05:18  No: 50545  IP: [192.*.*.*]

> EOF は表記上存在するだけで、ソースに書かなくても良いのでは?

stdio.hで定義されるEOFというマクロシンボルを使うソースがファイルに存在します。
e.g.) while ((c = getchar()) != EOF)


> それともファイル処理で_eof絡みかな?

そんな非ANSIな関数,プログラミング言語Cでは扱っていません。
#第8章を除く。

編集 削除
亜衣  2002-11-06 21:20:52  No: 50546  IP: [192.*.*.*]

質問があいまいでした。ごめんなさい。YuOさんご指摘ありがとうございました。勉強になりました。
  1.5.3 行数のカウント(p.24)や1.6  配列(p.27)のプログラムにはいずれもwhile((c = getchar()) != EOF)が含まれており、コンパイルはされるのですが、プログラムを実行させて黒い画面になり、キーボードのどれを押しても押した文字が記述されるだけなのです。結果を出力するために何か操作をしなければならないのでしょうか。

編集 削除
YuO  2002-11-06 23:20:07  No: 50547  IP: [192.*.*.*]

これは,C言語ではなく,コンソールに関する話ですね。

WindowsのConsole(MS-DOSプロンプトやコマンドプロンプト)やMS-DOSでは,Ctrl+ZがEOF入力になります。
他のOSであれば他のキーになると思います。

編集 削除
亜衣  2002-11-07 00:36:26  No: 50548  IP: [192.*.*.*]

YuOさん回答ありがとうございます。Ctrl+ZによってPress  anykey  to  continueが表示され終了できるのはわかったのですが、前述のプログラムはEOFでない入力時に改行'\n'をカウントして行数を表示するプログラムであったと思うのですが、キーボードのどれを押しても押した文字が記述されるだけで結果が表示されません。なにか操作をしないといけないのでしょうか。

編集 削除
YuO  2002-11-07 13:10:15  No: 50549  IP: [192.*.*.*]

Press anykey to continue
と表示される前に行数が表示されていませんか?

編集 削除
亜衣  2002-11-07 21:17:18  No: 50550  IP: [192.*.*.*]

プログラムを実行すると真っ黒な画面になり、そこに文字を入力したり、リターンを押して改行した後に、Ctrl+Zを押すと、最後に入力した文字の後にPress anykey to continueが表示されるだけです。プログラムは何度確認しても本の通りに記述しています。

編集 削除
YuO  2002-11-07 23:14:07  No: 50551  IP: [192.*.*.*]

プログラムは,printfの行を実行していますか?
IDEでブレイクポイントを設定して実行すればチェック可能です。

あと,コンソールから直接起動した場合はどのようになりますか?

編集 削除
亜衣  2002-11-08 02:06:49  No: 50552  IP: [192.*.*.*]

初心者なのでやり方がイマイチわかりません。とりあえず、main(){・・・}のあとにカーソルをあわせて、カーソル前までのデバックを実行したところ、別のフレームにシンボルnl、値4などのようにそれらしい値は表示されいます。黒い画面には何も結果が表示されません。例題どおりのプログラムを記述してprintfの行を実行しないようなことが起こったりするのですかね。ん〜ん訳がわからないです(T_T)。

編集 削除
YuO  2002-11-08 09:16:40  No: 50553  IP: [192.*.*.*]

うーん,p.24のプログラムを実際に入力して実行してみたのですが,
ちゃんと結果が表示されていますよ。
[コンパイラ]
・Microsoft Visual C++ 5.0 (with Service Pack 3)
・Borland C++ 5.5.1 for Windows
[OS]
・Microsoft Windows NT 4.0 (with Service Pack 6a - NEC)

実際にコンパイルしているプログラムをCopy & Pasteしてここに書き込んでみてください。

編集 削除
亜衣  2002-11-08 19:32:01  No: 50554  IP: [192.*.*.*]

何度も質問してすみません。
こちらは
[コンパイラ]
・Microsoft Visual C++ 6.0 (with Service Pack 2)
[OS]
・Microsoft Windows 98

#include <stdio.h>

main()
{
    int c, nl;

     nl = 0;    
    while ((c = getchar()) != EOF)
        if (c == '\n')
          ++nl; 
   printf ("%d\n", nl); 

}

編集 削除
亜衣  2002-11-08 19:45:26  No: 50555  IP: [192.*.*.*]

追記

デバックをおこなった後に
thisというところに
「CXX0017:Error:シンボル”this”が見つかりません」
デバックというところに
「'C:\WINDOWS\SYSTEM\KERNEL32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。」と言うメッセージが表示されています。何か関係あるのでしょうか。

編集 削除
KF  2002-11-08 21:37:08  No: 50556  IP: [192.*.*.*]

VisualC++ 6.0 で亜衣さんのソースをそのままコンパイルして実行
しましたがちゃんと動作しました. 
a[ENTER]
b[ENTER]
c[ENTER]
Ctrl+Z[ENTER]
3   <- 行数が表示された
Press any key to continue

Ctrl+Z(コントロールZ) の次に 3 と行数が表示されました.
プログラムはメニューの ビルド/実行 をクリックして実行します.
ショートカットは Ctrl+F5 です.

'C:\WINDOWS\SYSTEM\KERNEL32.DLL' をロードしました... という
メッセージは今回の件には関係ありません.

編集 削除
NoiNoi  URL  2002-11-09 08:59:44  No: 50557  IP: [192.*.*.*]

NoiNoiといいます。

#include <stdio.h>

main()
{
  int c;
  int nl=0;

  while ((c = getchar()) != 'a')
  {
    if (c == '\n'){
      nl++;
      printf ("[ENTER]\n");
    }else{
      printf ("[%d]\n", c);
    }
  }

  printf ("%d\n", nl); 

}


これでどうでしょうか?
使用方法としましては
Aボタンで終了というこで、、、

で、よくわからないことがひとつあるのですが、、、、
Ctrl + C
を押すとバグリマス。
それって僕だけ?

編集 削除
亜衣  2002-11-09 11:41:30  No: 50558  IP: [192.*.*.*]

私が記述したソースを他の方がそのままコンパイルして実行すると正常に動作するってことはますますわけがわからなくなりました。私自身VC++の扱い方がイマイチ把握していないこともあるので操作方法自体がまちがっているのでしょか?でも前記した本の最初のプログラム(温度換算プログラム)は正常に動作しました。EOFがでてきてから本のとおりのプログラムを記述してもそのとおりに動作しません。

ソースファイルにプログラムを記述しているんですがそれでよろしいのでしょうか(cpp)。また、何かのファイルと同じフォルダに保存しないといけないとかあるのでしょうか。

その他にも何かお気づきの点がありましたら助言していただけないでしょうか

このプログラムにこだわらず先に進んだ方がいいのでしょかね?

編集 削除
YuO  2002-11-09 21:49:08  No: 50559  IP: [192.*.*.*]

とりあえず,拡張子はcにした方がよいですね。
#コンパイルが早くなる

とりあえず,先に進んでもいいと思いますよ。

編集 削除
亜衣  2002-11-12 21:01:19  No: 50560  IP: [192.*.*.*]

わかりました。それでは先に進みたいとおもいます。
みなさんいろいろ教えていただきありがとうございました。

編集 削除
亜衣  2002-11-12 21:02:27  No: 50561  IP: [192.*.*.*]

とりあえず解決です。

編集 削除