C++ 如果调用fclose(0),是否关闭stdin?

C++ 如果调用fclose(0),是否关闭stdin?,c++,c,posix,stdin,C++,C,Posix,Stdin,如果调用fclose(0),是否关闭stdin 我之所以问这个问题,是因为出于某种原因,stdin在我的应用程序中被关闭了,我不知道为什么。我检查了fclose(stdin),但这不在应用程序中,因此我想知道fclose(0)是否会导致未定义的行为,例如关闭stdin 如果没有,还有哪些方式会导致stdin错误关闭?我认为它会将其视为fclose(NULL);它应该是未定义的,并且可能会崩溃。以下关闭标准: close(0) fclose(标准输入法) 关闭(标准文件号) 守护进程(0,0)fc

如果调用fclose(0),是否关闭stdin

我之所以问这个问题,是因为出于某种原因,stdin在我的应用程序中被关闭了,我不知道为什么。我检查了fclose(stdin),但这不在应用程序中,因此我想知道fclose(0)是否会导致未定义的行为,例如关闭stdin


如果没有,还有哪些方式会导致stdin错误关闭?

我认为它会将其视为
fclose(NULL)
;它应该是未定义的,并且可能会崩溃。

以下关闭标准:
close(0)
fclose(标准输入法)
关闭(标准文件号)

守护进程(0,0)

fclose的签名如下:

int fclose ( FILE * stream );
这意味着,
fclose
需要指向
FILE
对象的指针。因此,如果传递
0
,而不是指针,
0
将被理解为
NULL
pointer1。如果它的指针为空,您希望它如何关闭
stdin
?它不会关闭。使用
fclose(stdin)
,因为
stdin
本身是指向
文件
对象的指针

我认为你把
stdin
与文件描述符混淆了,文件描述符是整型的,通常表示为
fd
。输入流的
fd
确实是
0
。因此,如果您想使用
fd
(而不是
FILE*
),那么您必须使用
中的
关闭

#包括
int close(int fildes);
也就是说,
close(0)
将关闭stdin


1:有趣的是,如果您将
1
传递给fclose并打算关闭
stdout
,您的代码甚至不会编译,并且您会在编译时立即看到代码本身的问题。现在的问题是,为什么它不编译?因为与
0
不同,
1
未隐式转换为指针类型。编译器将生成如下消息:错误:从“int”到“FILE*”的转换无效。
。请查看错误和行号。

fclose(0)
调用未定义的行为,因此是的,它可以执行任何操作,包括关闭
stdin
。但是如果
fclose(0),问题会更大
出现在您的代码中。

文件号(stdin)= 0,但STDIN!=0,您是否需要关闭STDIN的错误方法?那么,我们大多数人现在都在做这件事:-您确定它在您的应用程序中关闭而不是在您的应用程序之前关闭吗?<代码> STDIN <代码>在程序的一个运行开始时正确工作,然后在运行的中间停止工作?如果没有,也许程序TH至少调用了已关闭(或从未设置)的stdin。它可能与Mac OS X手册页中定义的崩溃:)重复:fclose()函数不处理空参数;它们将导致分段violation@Nawaz但是使用
fclose(stdin)安全吗
?它是否产生任何未定义的行为?如中所示,它与调用
close(0)
?@Djack:1)是。2)否。3)否有任何不同。
#include <unistd.h>
int close(int fildes);