2011-01-12 2 views
0

私はC言語でプログラミングしていますので、stdinの行数を知る必要があります。 特定の行数の後、1行上にスクロールする必要があります... ANSIエスケープコード(033 [1S])を使用しましたが、行の内容が失われてしまいました。ヘルプシェルのスクロールと行数

EDIT:これはコードのテーブルにページダウンansi escape codesスクロールのための良い参考です第二ポイント

#include <stdio.h> 

int main(void) { 
    printf("one\ntwo\nthree\n"); 
    fputs("\033[1S", stdout); 
return 0; 
} 
+0

あなたのANSIエスケープコード( '\のx033'プラス' [1S')は、端末上での表示を制御するために使用されます。 – Benoit

+0

私のアプリケーションは端末で動作します。問題は、 "033 [1S"]でスクロールしたときです...スクロールされた行の内容が失われています(スクロールバックしています)。内容を失うことはありません。 – ubuntiano

+0

あなたの質問は明確ではありません。あなたが望むものと何が起こっているのかを簡単な例を挙げてみてください(端末を表すために数行だけを使用してください)。また、さまざまな場所であなたのプログラムで何が起こっているのか、そしてその行の内容を失うことによって何が起こっているのかを話してください。 – nategoose

答えて

1

を説明するための簡単なコード。

新しい行に移動するには、 "1S"に加えて\ 033 [1E]が必要な場合があります。コードで遊んでください。

また、環境から行/列を取得できると思います。 「HKO」へのコードのおかげで以下

http://www.linuxquestions.org/questions/programming-9/linux-c-syscall-to-get-number-of-columns-of-current-terminal-250252/

#include <sys/types.h> 
#include <sys/ioctl.h> 
#include <stdio.h> 

int main() 
{ 
    struct winsize ws; 

    ioctl(1, TIOCGWINSZ, &ws); 
    printf("Columns: %d\tRows: %d\n", ws.ws_col, ws.ws_row); 
    return 0; 
} 
+0

ありがとう、両方のソリューションが失敗しました。 1の場合は結果が同じになり、2つ目の場合はstdin(書き込まれた行)ではなく、ウィンドウの列と行の数(サイズに応じて)が返されます。 – ubuntiano

+0

ああ、あなたのプログラムが出力している行の数を追跡する必要があります。標準入力を読み込むごとにinと++を遭遇させるたびに、または同じことをstdoutに書き込んだ行あなたが '\ n'文字を書くときにそれらを数えるだけです。 –

+0

もう一度質問を読む私はあなたが必要とするものについてはっきりしていません。プログラム(stdout)によってスクリーンに以前に印刷された行までカーソルを移動する必要がありますか、またはプログラムの標準入力に来る行を数えなければなりませんか? –

0

からあなたは標準入力が何であるかについて誤解しているように見えます。コメントのintあなたの例では

出力この

$ prog 
one 
two 
three 

は、あなたが標準入力を通じてそれに情報を提供するためにそれをストリームまたはパイプを送信する必要がありますする必要があり、コマンドラインからプログラムを呼び出す

#include <stdio.h> 
int main(void) { 
    int c; int i = 1; 
    printf("one\ntwo\nthree\n"); 
    //while((c=fgetc(stdin)) != NULL) { 
    // comparing it with null is not correct here 
    // fgetc returns EOF when it encounters the end of the stream/file 
    // which is why an int is returned instead of a char 
    while((c=fgetc(stdin)) != EOF) { 
    if (c=='\n') { 
     printf("%d\n", i); i++; 
    } 
    } 
    return 0; 
} 

$ cat myfile | prog 
one 
two 
three 
4 # or however many lines are in myfile 

stdinはデフォルトでは空白です。

1 ./eof_testing 
one 
two 
three 
jfklksdf #my typing here 
1 
fjklsdflksjdf #mytyping here 
2 
fjklsdflksdfjf # my typing here 
3 

sttyのシステムコールの一例を追加----- ----:あなたはそれに入力する場合は、ハイテク、これは私がコードの上HTEをコンパイルから見たものである

を入力するまで、何も送信されません

#define STDIN_FD 0 
#define STDOUT_FD 1 
#define CHUNK_SIZE 8 

#define QUIT_CHAR (char)4 /* C-D */ 
int main(){ 
    write(STDOUT_FD,"hi\n",3); 
    char buff[CHUNK_SIZE]; 
    int r, i; 
    system("stty -echo raw"); 
    while(r = read(STDIN_FD, &buff, CHUNK_SIZE)){ 
    for(i = 0; i < r; i++){ 
     if(buff[i] == QUIT_CHAR) 
     goto exit; 
    } 
    write(STDOUT_FD, &buff, r); 
    } 
    exit: 
    system("stty echo cooked"); 
    return 0; 
} 

今、しかし、そのようなキーとして取り組む課題の全く新しいセットが、そこにある「\ rを」文字ので、代わりにそれだけで行の先頭に戻り、改行を送信します。これは、文字がプログラムに直接送られるようになったため、端末は 'cooked'モードで起こっていた '\ n'文字で行が終わらないためです。

http://starboard.firecrow.com/interface_dev/mle.git/editor/editor.c

+0

ああ、私たちは同意します!私がstdin(C言語でのみ)から直接聞いたことをする方法はありませんが、私は解決策を見つけなければなりません... stdinを別のストリームにコピーしますか?それが可能だ? – ubuntiano

+0

あなたはrawモードシステム( "stty raw -echo")で設定できます。 //コード;システム( "stty cooked echo");そしてそれはあなたが各文字をタイプされたものとして見ることを可能にします。あるいは、stdinを別のストリームにコピーしたり、charの配列をコピーしたりすることはできますが、stdinストリームでは実行できないコピーで何ができるかわかりません。 –

+0

私の場合、system()で簡単な例を書くことができますか? – ubuntiano

関連する問題