帮助滚动和shell中的行数

时间:2011-01-12 18:47:01

标签: c ansi-escape

我在C编程,我需要知道stdin的行数。 在一定数量的行之后,我还需要向上滚动一行...我使用ANSI转义码(033 [1S],但是我丢失了滚动行的内容,我不想这样。

编辑:解释第二点的简单代码

#include <stdio.h>

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

2 个答案:

答案 0 :(得分:1)

这是ansi escape codes向下滚动页面到代码表的一个很好的参考。

我相信您可能需要\ 033 [1E除了“1S”以向下移动到新线路。玩这些代码。

我认为你可以从环境中获得行/列。

以下代码感谢来自http://www.linuxquestions.org/questions/programming-9/linux-c-syscall-to-get-number-of-columns-of-current-terminal-250252/

的“Hko”
#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;
}

答案 1 :(得分:0)

看起来你错了stdin是什么。

在您的示例中注释:

#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; 
}

从命令行调用程序应输出此

$ prog
one
two
three

你必须发送一个流或管道,通过stdin

给它提供信息
$ 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系统调用的例子----

#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'字符,而不是换行符,它只返回到行的开头。这是因为现在角色直接进入程序,行终止时没有以“熟”模式发生的'\ n'字符终止。

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