用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;
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打开文件之后,如何相应关闭文件使得可以再次从键盘输入?的主要内容,如果未能解决你的问题,请参考以下文章