如何确定stdin是否为空

时间:2017-11-16 02:19:44

标签: c

我有一个小项目可以上学。我们有一个生成迷宫的程序。 我们可以设置参数来生成不同的迷宫,甚至可以将其作为图片。

我们称之为:

  

./ test

  

./ test --arg1 val --arg2 val --etc

我们被要求将参数解析为我们放入stdin的文件:

  

./ test< args.txt

现在我必须能够使用上面的每一行来调用程序。带参数的行工作,我的stdin中的程序工作,但没有任何东西的行不再工作。

所以我应该检查用户是否在stdin中发送了一些文件我用文件调用程序,否则我称之为正常方式。我尝试过feof但它无法工作,因为stdin赢得了甚至没有任何东西。 当我在没有参数或文件的情况下调用程序时,它等待用户写一些东西,这不应该。

基本上我的代码应该是那样的

    int main()
{


    int v;
    if (stdin!=NULL)) //if a file has been passed "./test <test.txt"
    {
         scanf("%d",&v);
    }
    else {  //if no files has been passed "./test "
        printf("no file forwarded \n"); 
        return 1;
    }
    if (v<50){printf("you drive slow\n");}
    else {printf("you drive fast\n");}
    return 0;
}

但显然(stdin!= NULL)不起作用。那么有没有办法检查stdin是否有东西? 我问我的同学,其中一个告诉我一些关于使用fgetc来获取第一个字符然后如果真的有一个字符然后把它放回去但是当我尝试使用fgetc时,如果没有字符它等待我放一个char in。

那我怎么能检查stdin是否为空或者是否有文件(不使用新库)?

提前谢谢你 祝你有个美好的一天

如果我不完全清楚,请告诉我,我不是母语人士,我有一些困难,因为它是一个技术问题

3 个答案:

答案 0 :(得分:1)

听起来您希望根据命令行提供的参数或从文件传入的参数运行程序。如果是这样,您应该首先检查命令行是否已提供参数:

if (argc > 1) {
  //parse argv
}

然后,检查stdin是否为空,如果没有读取stdin中的参数:

else if ((fseek(stdin, 0, SEEK_END), ftell(stdin)) > 0)
{
  rewind(stdin);
  char buffer[1024];
  fgets(buffer, 1024 , stdin);
  //parse args read in from stdin
}
else
{
  //no redirection
}

答案 1 :(得分:1)

好的,我找到了一个解决方案,它不是最好的解决方案,因为我不应该使用外部库但是现在它可行,我希望它对某人有用:

feof是一个好主意,但实际上它不起作用,原因是如果你在其中没有任何东西,stdin将永远不会有EOF。因此,如果您提供文件,因为您必须在没有文件时解析文件,它将尝试解析用户键入的内容。

首先你必须包括

#include <unistd.h>

然后

int v;
    if (!isatty(STDIN_FILENO)) //if stdin is not a terminal (a file was provided)
    {
         scanf("%d",&v);
    }
    else { //if stdin is a terminal (no file provided)
        printf("no file forwarded \n"); 
        return 1;   
    }
    if (v<50){printf("you drive slow\n");}
    else {printf("you drive fast\n");}
    return 0;

它将检查stdin是否是终端。 这个解决方案有效,但如果有人没有使用外部库,那就太棒了!

答案 2 :(得分:0)

  

如何确定stdin是否为空(?)

使用getchar()读取1个字符。

int ch = getchar();
if (ch == EOF) {
  if (feof(stdin)) puts("stdin empty");
  else             puts("stdin error"); // very rare
} else {
  ungetc(ch, stdin); // put back
  puts("stdin not empty");
}