• ベストアンサー

端末の同じ場所に出力

カウントした数字を表示だけのプログラムでprintf等を使って、 for(i=0;i<10;i++){  printf("%d",i);  sleep(1); } という風な記述をすれば $ ./a.out 0 1 2 3 4 5 ..... という風に表示されますが、そうではなく $ ./a.out 0 *** 1秒後 $ ./a.out 1 *** 2秒後 $ ./a.out 2 以下略   という風に同じ場所に出力したい場合は、(もしそのようなことが可能であれば)どういう方法があるのでしょうか? ms-dos や kterm等の端末で実現したいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • shige_70
  • ベストアンサー率17% (168/946)
回答No.2

termcap,terminfo,ncurses などを使います。 いずれもmanページがあると思いますので調べてみてください。 #1さんの方法は環境依存ですのでおすすめしません。環境による違いを吸収するのがtermcapやterminfoです。ncursesはそれより上位のライブラリで、キャラクタ端末上でウィンドウを表示したりできます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • shige_70
  • ベストアンサー率17% (168/946)
回答No.4

#2です。再度失礼します。 #3さんが正解です。 私の紹介したものを使うといろいろできますが、ご質問のケースに限れば#3さんの回答のとおりにされるのがいちばん簡単で良いでしょう。

全文を見る
すると、全ての回答が全文表示されます。
  • ara_ara
  • ベストアンサー率35% (124/348)
回答No.3

簡単に  printf("%d\r",i); というのもまずいのかな?

全文を見る
すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

エスケープシーケンスという、制御文字が利用できます。 printf("\x1b[2J") は、ESC[2J(画面消去)になります。 時間はtime関数が使える思います。 あとは、ループで廻すだけ。 http://www1.cts.ne.jp/~clab/hsample/Time/Time3.html

参考URL:
http://hp.vector.co.jp/authors/VA016670/escape_code.html,http://homepage3.nifty.com/peterpan/etescseq-eseq.html
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Emacs端末上で、Cプログラムが適切に動作しない

    こんにちは。 OSは現在、64bit版のWindows7を使っており、Emacsは、Gnu Emacs for Windows 23.4 を使っています。 Emacsのシェルモード(「M-x shell」で起動するモード)では、シェルとしてCygwinに付属しているbashを使い、C言語のソースをコンパイル(あるいはビルド)する場合は、Cygwinのgccを使おうと考えています。 ところが、ビルドしたプログラムをEmacsのシェルモードで実行すると、上手く起動しないので困っています。 具体的には、以下の通りです。 まず、テスト用のCソースファイルとして、以下のような、test.cを作成しました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { int num=2; printf"Enter integer: "); scanf("%d", &num); printf("Number enterd: %d", num); } ------------------------------------------------------------ これをシェルモードで、gccを使ってビルドし、作成されたa.exeを実行すると、以下のようになりました。 [TERM=emacs] ------------------------------------------------------------ Kei-Lavie@Kei:~/C_Programs $ gcc test2.c Kei-Lavie@Kei:~/C_Programs $ ./a.exe 20 Enter integer: Number enterd: 20 ------------------------------------------------------------ 作成された実行ファイルのa.exeを実行すると、まず Enter integer: と表示されるはずなのですが、それが表示されず、止まります。 そこで、整数として適当に20を入力してみると、 Enter integer: Number enterd: 20 と出力されました。 どうやら、必要な入力操作が終わってから、全ての出力操作が行われるようです。 その事を確認するために、先ほどのtest.cのmain関数を、以下のように変更し、数値を入力する場面を2箇所設けました。 ------------------------------------------------------------ int main(void) { int i=2; double d=0.1; printf("Enter integer: "); scanf("%d", &i); printf("Integer enterd: %d", i); printf("\n"); printf("Enter number: "); scanf("%lf", &d); printf("Number enterd: %f", d); } ------------------------------------------------------------ これをシェルモードで、gccを使ってビルドし、作成されたa.exeを実行すると、以下のようになりました。 [TERM=emacs] ------------------------------------------------------------ Kei-Lavie@Kei:~/C_Programs $ gcc test.c Kei-Lavie@Kei:~/C_Programs $ ./a.exe 20 0.123456789 Enter integer: Integer entered: 20 Enter number: Number entered: 0.123457 ------------------------------------------------------------ 作成された実行ファイルのa.exeを実行すると、まず Enter integer: と表示されるはずなのですが、それが表示されず、止まります。 そこで、整数として20を入力してみても止まったままです。 そして浮動小数点数として0.123456789を入力すると、 Enter integer: Integer entered: 20 Enter number: Number entered: 0.123457 と出力されました。 やはり、必要な全ての入力操作が終わってから、最後に全ての出力操作が行われるようです。 しかし、作成されたa.exeを、ktermといった端末上で実行すると、プログラムは以下のように適切に動作します。 [TERM=kterm] ------------------------------------------------------------ Kei@Kei-Lavie /cygdrive/c/Emacs_for_Windows/C_Programs $ ./a.exe Enter integer: 20 Integer entered: 20 Enter number: 0.123456789 Number entered: 0.123457 ------------------------------------------------------------ つまり、上記のように、作成されたプログラムが適切に動作しない問題は、Emacs端末に固有のもののようです。 上記のような問題を解決しようといろいろ試していると、kterm上で、a.exeの出力を、catやnkfといった出力コマンドにパイプすると、上記のような問題と同じ動作をしました。 具体的には以下の通りです。 [TERM=kterm] ------------------------------------------------------------ Kei@Kei-Lavie /cygdrive/c/Emacs_for_Windows/C_Programs $ ./a.exe |nkf 20 0.123456789 Enter integer: Integer entered: 20 Enter number: Number entered: 0.123457 ------------------------------------------------------------ 以上のような事から、どうやらEmacsのシェルモードでは、プログラムの出力を、catなどの出力コマンドにパイプしているのだと予想されます。 そこで、シェルモードの動作を決めると思われる、shell.el(あるいはshell.elc)やcomint.el(あるいはcomint.el)の内容を見てみたのですが、複雑すぎて、どの部分がEmacs端末上での出力に関与しているのかが分かりませんでした。 どうしてもEmacsのシェルモードを使って、C言語での開発を行いたいと思っていますので、 以上の件について、同じような経験をされた方、あるいは、何か解決策としてのご提案がある方は、是非、投稿をお願い致します。 自力では解決できそうにないので、どうか力をお貸しください。 よろしくお願い致します。

  • 1秒未満間隔のファイル更新について

    皆様 下記のようなプログラム(Perl)で、1秒未満のファイル更新を試みております。sleep(1)として、待ち時間を1秒とすると、data.txtに時刻が更新されますが、sleep(0.8)、sleep(0.5)等として待ち時間を1秒未満にすると、プログラムは動作するのですが、data.txtはファイルとして作成されません。 これは、printf()関数のバッファリング、及びフラッシュに関する仕様に起因するものと思われますが、1秒未満の間隔でdata.txtを更新して時刻をdata.txtに書き込む処理は可能でしょうか? #強制フラッシュの"$| = 1;"を使い、sleep(0.8)としても駄目でした。 すみませんが、よろしくお願いします。 (コード) #use Time::HiRes; #$| = 1; while(){ ($sec, $min, $hour, $day, $mon, $year) = localtime(time); open(OUT, "> data.txt"); printf(OUT "%2s:%2s:%2s\n", $hour, $min, $sec); close(OUT); sleep(1); }

  • for文の中にswitch文はいれられない??

    題名の通りfor文の中にswitch文はいれられないのでしょうか? 例えばの例ですが、 for(i=1;i<3;i++){ switch (i) { case 1: printf("←\r"); Sleep(400); break; case 3: printf("↑\r"); Sleep(400); break; default: printf("others\n"); break; } } このようなプログラムはかけないのでしょうか。 実行すると何も表示されないのですが、どこかおかしいのでしょうか?? どなたかご指導お願いします><

  • あと少しなんですが・・・

    入力: This is a pen. 入力文字列:[ This is a pen. ] 出力文字列;[ pen. a is This ] ――――――――――――――――――― 上に示したように単語の順番をさかさまにして表示するプログラムを作りました。しかし、今のプログラムでは、最初に空白が来たり、空白が連続すると正しく表示できません。どこを修正すればいいのか教えてください。 -------------------------- #include <stdio.h> #define BUF 1024 void out(int,char); int main(void){ char in[BUF]; /* 入力された文字列を保存する */ char out[BUF]; /* inoput の内容を単語逆順にして保存する*/ int wordcount; /* 文字カウント */ char *in_ptr,*out_ptr; /* それぞれの文字列の文字をさすポインタ */ int i,j,a,b; /* 繰り返し用カウンタ */ /* メッセージの表示+文字列の入力 */ printf("入力: "); fgets(in, sizeof(in), stdin); /* ポインタの初期化 */ in_ptr = in; out_ptr = out; /* 単語数の初期化 */ wordcount = 0; /* 単語数を数える作業 */ while(*in_ptr != '\n'){ if(*in_ptr!=' '&&(*(in_ptr+1)==' '||*(in_ptr+1)=='\n')){ wordcount++; } in_ptr++; } /* メッセージの表示+単語数の表示 */ printf("\n文字数のカウント開始\n"); printf("文字数のカウント終了: %d単語\n",wordcount); printf("\n入力文字列:[ %s ]\n", in); printf("出力文字列;[ "); /* 単語逆順処理作業 */ b=0; for(a=0;a<wordcount;a++){ j=0; b++; in_ptr = in; for(i=0;i<(wordcount-b);i++){ while(*in_ptr!=' '){ j++; in_ptr++; } in_ptr++; } /* ポインタを単語の頭に持っていく */ in_ptr= in + (j+(wordcount-b)); /* inをoutにコピー */ while(*in_ptr!='\0' && *in_ptr!=' ' && *in_ptr!='\n'){ *out_ptr = *in_ptr; in_ptr++; out_ptr++; } if(*in_ptr==' '||*in_ptr=='\n'||*in_ptr=='\0'){ *out_ptr = ' '; out_ptr++; } } printf("%s]\n",out); return 0; }

  • 三項演算子についてお聞きします。

    当方、Javaに取り組み始めた初心者です。 C言語で int i = 20; i <= 10 && i >= 0 ? printf("ok") : printf("ng"); //実行結果:ng と記述するとエラーにならずにちゃんと実行されるのですが、JAVAで同じように記述するとエラーになります。なぜでしょうか??お詳しい方、ご教授いただけると幸いです。 [Java] int i = 20; i <= 10 && i >= 0 ? System.out.println("ok") : System.out.println("ng"); //実行結果:エラー

    • ベストアンサー
    • Java
  • WindowsXPでRAMDISK

    MS-DOS時代にあった,RAMDISKのようなことを WindowsXPで実現する方法,何かございませんでしょうか? ------------------------- MS-DOSでは,CONFIG.SYS に DEVICE=A:\DOS\HIMEM.SYS DEVICE=A:\DOS\RAMDISK.SYS 1024 のような記述をしました. ------------------------- よろしくお願いします.

  • C、C++

    SE未経験で勉強中です。 C、Visual studioC++、Windows 10 問題: sキーを入力してから10秒後に、 "10秒経ちました"と表示する。 for、Sleep、scanfを使用。 どのようにかいたらよいのか なんどやってもエラーは出ないものの 10秒経ったら文字が表示されることしかできず、 sキーを押してから10秒後、という処理ができません。 教えていただけたら幸いです。 #include 〈stdio.h〉 #include 〈windows.h〉 int main(void) { printf(“sキーを入力してください。”); Sleep(10000); printf(“10秒経ちました!” ); } ↑ここにどうやったらsキーを押してからこの処理を実行させるのですか?

  • なんで例外出力されるんですか?

    また恥を忍んで理解の為動かないソースを載せます。 idexの入力値が1だとしてnの入力値が3の話をします このソースを実行させると以下の例外が出力されます java.lang.ArrayIndexOutOfBoundsException この例外の意味は不正なインデックスを使って配列がアクセスされたときに発生する例外と意味です。 ではなんでjava.lang.ArrayIndexOutOfBoundsException出力されるんですか メソッド部分のint[] tmp=new int[a.length-n]; for(int i=idex+n; i<a.length; i++){ tmp[i]=a[i]; } return tmp; } はtmpは配列aの長さ分-nですから配列2番目まで入ることはわかっています で次のカウントアップさせる変数int宣言して i=idex+n;を i<a.length; i++をしていますからidexが1でnが3だったら4で4<6になるんじゃないんですか? import java.util.Scanner; public class Ensyuu725 { /** * @param args */ public static void main(String[] args) { Scanner sc=new Scanner(System.in); int []a=new int[]{1,3,4,7,9,11}; for(int i=0; i<a.length; i++){ System.out.println("配列aの要素は"+"a["+i+"]"+a[i]); } System.out.print("削除する a[idx]:"); int idex=sc.nextInt(); System.out.print("a[idex]から何個削除しますか?"); int n=sc.nextInt(); int k[]=arrayRmvOfn(a,idex,n); for(int i=0; i<k.length; i++){ System.out.println("配列aが消された後の要素は"+"k["+i+"]"+k[i]); } } /** * @param a * @param idex * @param n * @return tmp */ private static int[] arrayRmvOfn(int[] a, int idex, int n) { int[] tmp=new int[a.length-n]; for(int i=idex+n; i<a.length; i++){ tmp[i]=a[i]; } return tmp; } } ご指導お願いします。

    • ベストアンサー
    • Java
  • 1秒毎に1カウントアップ

    1秒経つとカウントを一つアップするというプログラムを作ろうと思いますが、sleep関数を使う事でOKでしょうか? ネットで調べてみるとsleep関数の精度はあまり高くないと書かれていました。カレンダーを表示するプログラムに使いたいのであまり精度が悪いと困ってしまいます。もし何か他に良い方法があれば教えてください。よろしくお願いします。

  • 平均値を関数を用いて出力したいのですが。。

    平均値を関数を用いて出力したいのですが一箇所でつまずいてしまい ました。ソースは #include <stdio.h> #include <stdlib.h> #include <time.h> /*構造体宣言*/ struct Students{ int N; int A; int B; int C; double ave; }; /*平均値を計算する関数*/ struct Students Average(struct Students std[i]){ std[i].ave=(double)(std[i].A+std[i].B+std[i].C)/3; return std[i]; } int main(void){ struct Students std[49]; /*構造型配列*/ int i,N,A,B,C,num,scannum; FILE*file; /*ファイルのポインタを用意*/ srand((unsigned)time(NULL)); /*乱数の初期化/ file=fopen("Data.txt","r"); /*Dataファイルの読み込み*/ /*ファイルのオープンチェック*/ if(file==NULL){ fprintf(stderr,"cannnot open file 'Data.txt'\n"); exit(1); } /*Studentsにデータを格納*/ for(i=0;i<=49;i++){ fscanf(file,"%d%d%d",&N,&A,&B); std[i].N=N; std[i].A=A; std[i].B=B; std[i].C=70+(rand()/(RAND_MAX+1.0)*31); std[i].ave=Average(std[i]); /*表示*/ printf("学籍番号:%d.",std[i].N); printf("科目A:%d.\n",std[i].A); printf("科目B:%d.\n",std[i].B); printf("科目C:%d.\n",std[i].C); printf("平均点:%d.\n",std[i].ave); fclose(file); return 0; } 目標はA,B,Cの平均を出したいのですが関数宣言の際にstd[i]を 用いると未定義扱いになってしまい実行が出来ない状態です。 自分としては↑のソースでi番目の配列の平均値を導出し、表示 させようとしてるのですが。。。。アドバイスをお願いします。 m(__)m

このQ&Aのポイント
  • スマホケースの耐衝撃性について詳しく教えてください。初心者ですので、どのタイプのケースが良いか分かりません。
  • 手帳タイプのケースと背面に被せるタイプのケース+保護フィルムの耐衝撃性を比較してください。
  • 保護フィルムの割れ防止効果について疑問があります。皆さんの意見を聞かせてください。
回答を見る