用freopen打开文件之后,如何相应关闭文件使得可以再次从键盘输入?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用freopen打开文件之后,如何相应关闭文件使得可以再次从键盘输入?相关的知识,希望对你有一定的参考价值。

参考技术A fclose(stdout);或者fclose(stdin);

看你的问题应该是重定向输入了,那就是fclose(stdin);追问

的确是关闭文件了,至少读不了文件的内容,可是后面还是无法手动输入啊(好像随机读取不知道哪里的变量了)……这又是为什么?

追答

那你要有手动输入的指令啊

追问

有手动输入指令。
我举个例子:
#include
#include
using namespace std;
int main()

freopen("123.txt","r",stdin);
fclose(stdin);
int a;
cin>>a;
cout<<a<<endl;
return 0;

这个代码运行下来和
直接(没有输入)
cout<<a<<endl;
是一样的结果。

把fclose(stdin)注释掉则显示123.txt里面的结果。

所以我才说没有手动输入

追答

freopen("123.txt","r",stdin);
fclose(stdin);
freopen("CON","r",stdin); //加这一句,"CON"代表控制台
int a;
cin>>a;
cout<<a<<endl;
return 0;

本回答被提问者采纳
参考技术B 应该是回到控制台吧 我来回答吧

freopen("CON","r",stdin);
额 刚看到 原来上面有~~

如何重新打开已关闭的文件描述符

【中文标题】如何重新打开已关闭的文件描述符【英文标题】:How to re-open a closed file descriptor 【发布时间】:2012-03-30 05:25:44 【问题描述】:

我有一个场景,我为两个孩子和父母之间的通信创建了管道。父级将(使用 write 函数)数据写入管道并关闭相应的文件描述符。问题是当我想再次向管道写入数据时,写入函数返回错误代码-1。我认为这是因为写作结束在之前的迭代中已经关闭。那么对应的文件描述符被关闭一次后如何打开呢。

我尝试使用需要某个文件的路径作为参数的 open() 函数。但我没有在我的应用程序中使用任何文件。我有简单的文件描述符(int arr[2])。

是否可以通过管道实现上述场景????

【问题讨论】:

【参考方案1】:

一旦管道关闭,它就关闭了。你不能把它带回来。

如果你想写更多,首先不要关闭它——就这么简单。

【讨论】:

如果我们不关闭文件描述符,它不会将 EOF 发送到相应的流。所以在子进程中它将不断等待输入。但是,我想向流中写入有限次数并在管道的另一端同时读取 @chaitu: 是的,如果不关闭写端,读端就不会显示end-of-file。这意味着您需要使用文件结尾以外的其他内容来表示消息的结尾,如果您想向孩子发送更多消息(通常,您将使用固定长度的消息,以便孩子知道多长时间它是)。 @chaitu 你能发布你的解决方案或解决方法吗?【参考方案2】:

关于 unix 下与文件相关的任何事情(管道也是某种文件)的知识:文件名仅用于打开文件。稍后直到文件打开,它永远可用,直到关闭,并且永远不会再次使用名称。当有人在另一个窗口打开时删除文件时,只是名称消失了,而不是文件。这意味着:

    文件仍在磁盘上 它没有名字 它仍然开放 当它关闭时,内核会永久删除它

知道这一点可能有助于理解,为什么这几乎不可能再次“重新打开”文件、管道或类似的东西。文件名和描述符有不同的生命周期。

唯一的例外是 stdout 和 stderr,它们的描述符总是被称为 1 和 2。

【讨论】:

以上是关于用freopen打开文件之后,如何相应关闭文件使得可以再次从键盘输入?的主要内容,如果未能解决你的问题,请参考以下文章

C语言最文件操作函数(2)

MFC打开控制台输入信息和关闭控制台

MFC打开控制台输入信息和关闭控制台

VSCode无法使用freopen文件输入输出

freopen重定向输入

freopen函数的用法