检查C中的输入流是否为空
Check if the input stream is empty in C
我正在学习C语言,我的程序遇到了问题。
所以,我有一个名为 TEST
的程序,这个程序应该允许我使用 argv[]
或使用输入流 $ TEST < argsTest.json
.
来读取参数
argsTest.json :
{
"a" = 2,
"b" = 3
}
为了简化我的问题,我将使用这个简单的程序:
Struct {
int a;
int b;
} number;
int main(int argc, char **argv) {
json_t * root;
struct number numbers;
int c = 0, i = 0 , result;
char str[1024]; // I'm not using malloc just to simplify my question
// default values
numbers.a = 0;
number.b = 0;
if (argc == 1 && !feof(stdin)) {
while((c = fgetc(stdin)) != EOF) {
str[i]=c;
++i;
}
str[i] = '[=11=]';
.... // code that use jansson library to extract value
/** let's suppose we have extracted the two value int json_a
* and int json_b.
*/
numbers.a = json_a;
numbers.b = json_b;
} else if (argc == 3) {
scanf("%d", numbers.a);
scanf("%d", numbers.b);
}
result = numbers.a + number.b;
printf("%d\n", result);
return 0;
}
所以,我正在尝试实现三种行为:
$ TEST
它应该显示 0
(我们使用默认值)。
$ TEST < argsTest.json
显示5
。
$ TEST 4 3
显示7
.
我的问题是 if 语句 if (argc == 1 && !feof(stdin))
实际上
$ TEST
和$ TEST < argsTest.json
有相同的语句argc == 1
,所以
当 运行 $ TEST
它会出错,因为他进入了第一个条件。
我想要一个 if 语句来检查输入流是否为空并具有 0
参数,这样我就可以在不进入 if 语句的情况下实现第一种情况。
谢谢。
大意是
- 首先检查
argc
,看看您是否应该使用 argv
中的值
- 检查终端是否交互式
- 如果是则打印 0
- 如果它不是交互式的,那么您可以阅读
stdin
问题是没有可移植的方法来检查 stdin
是否是交互式的。但是,在 POSIX 系统上,您可以使用 isatty
函数,如 explained in this question.
所以假设您在 POSIX 系统上,代码如下所示:
int main(int argc, char *argv[])
{
struct number numbers;
if (argc == 3)
{
if (sscanf(argv[1], "%d", &numbers.a) == 1 && sscanf(argv[2], "%d", &numbers.b) == 1)
printf("From argv the answer is %d\n", numbers.a + numbers.b);
else
printf("Bad strings in argv\n");
}
else if (isatty(STDIN_FILENO))
{
printf("Nothing in argv or on stdin, so the answer is 0\n");
}
else
{
if (scanf("%d%d", &numbers.a, &numbers.b) == 2)
printf("From stdin the answer is %d\n", numbers.a + numbers.b);
else
printf("Found junk on stdin\n");
}
}
我正在学习C语言,我的程序遇到了问题。
所以,我有一个名为 TEST
的程序,这个程序应该允许我使用 argv[]
或使用输入流 $ TEST < argsTest.json
.
argsTest.json :
{
"a" = 2,
"b" = 3
}
为了简化我的问题,我将使用这个简单的程序:
Struct {
int a;
int b;
} number;
int main(int argc, char **argv) {
json_t * root;
struct number numbers;
int c = 0, i = 0 , result;
char str[1024]; // I'm not using malloc just to simplify my question
// default values
numbers.a = 0;
number.b = 0;
if (argc == 1 && !feof(stdin)) {
while((c = fgetc(stdin)) != EOF) {
str[i]=c;
++i;
}
str[i] = '[=11=]';
.... // code that use jansson library to extract value
/** let's suppose we have extracted the two value int json_a
* and int json_b.
*/
numbers.a = json_a;
numbers.b = json_b;
} else if (argc == 3) {
scanf("%d", numbers.a);
scanf("%d", numbers.b);
}
result = numbers.a + number.b;
printf("%d\n", result);
return 0;
}
所以,我正在尝试实现三种行为:
$ TEST
它应该显示0
(我们使用默认值)。$ TEST < argsTest.json
显示5
。$ TEST 4 3
显示7
.
我的问题是 if 语句 if (argc == 1 && !feof(stdin))
实际上
$ TEST
和$ TEST < argsTest.json
有相同的语句argc == 1
,所以
当 运行 $ TEST
它会出错,因为他进入了第一个条件。
我想要一个 if 语句来检查输入流是否为空并具有 0
参数,这样我就可以在不进入 if 语句的情况下实现第一种情况。
谢谢。
大意是
- 首先检查
argc
,看看您是否应该使用argv
中的值
- 检查终端是否交互式
- 如果是则打印 0
- 如果它不是交互式的,那么您可以阅读
stdin
问题是没有可移植的方法来检查 stdin
是否是交互式的。但是,在 POSIX 系统上,您可以使用 isatty
函数,如 explained in this question.
所以假设您在 POSIX 系统上,代码如下所示:
int main(int argc, char *argv[])
{
struct number numbers;
if (argc == 3)
{
if (sscanf(argv[1], "%d", &numbers.a) == 1 && sscanf(argv[2], "%d", &numbers.b) == 1)
printf("From argv the answer is %d\n", numbers.a + numbers.b);
else
printf("Bad strings in argv\n");
}
else if (isatty(STDIN_FILENO))
{
printf("Nothing in argv or on stdin, so the answer is 0\n");
}
else
{
if (scanf("%d%d", &numbers.a, &numbers.b) == 2)
printf("From stdin the answer is %d\n", numbers.a + numbers.b);
else
printf("Found junk on stdin\n");
}
}