Read from file or stdin

前端 未结 6 1185
北恋
北恋 2020-11-30 01:08

I am writing a utility which accepts either a filename, or reads from stdin.

I would like to know the most robust / fastest way of checking to see if stdin exists (d

6条回答
  •  悲&欢浪女
    2020-11-30 02:00

    You can just read from stdin unless the user supply a filename ?

    If not, treat the special "filename" - as meaning "read from stdin". The user would have to start the program like cat file | myprogram - if he wants to pipe data to it, and myprogam file if he wants it to read from a file.

    int main(int argc,char *argv[] ) {
      FILE *input;
      if(argc != 2) {
         usage();
         return 1;
       }
       if(!strcmp(argv[1],"-")) {
         input = stdin;
        } else {
          input = fopen(argv[1],"rb");
          //check for errors
        }
    

    If you're on *nix, you can check whether stdin is a fifo:

     struct stat st_info;
     if(fstat(0,&st_info) != 0)
       //error
      }
      if(S_ISFIFO(st_info.st_mode)) {
         //stdin is a pipe
      }
    

    Though that won't handle the user doing myprogram

    You can also check if stdin is a terminal/console

    if(isatty(0)) {
      //stdin is a terminal
    }
    

提交回复
热议问题