• 【杂文】关于 C++ 文件关联重定向回控制台的问题


    【杂文】关于 C++ 文件关联重定向回控制台的问题

    标题好长 awa

    写交互姬时遇到了一个问题,下面这种流程效果始终无法实现:

    • ((1).) 姬在控制台中输出若干信息。

    • ((2).) ( ext{Player}) 通过观察姬给出的数据,输入某些信息提供给交互姬。

    • ((3).) 交互姬读取 ( ext{Player}) 的输入,更新信息并进行下一轮循环。

    在操作时发现姬总是在无限读入回车,完全忽略掉了我的输入。

    【自闭现场】

    尝试了各种方案,比如把 ((1)) 操作改为输出到文件。但每次对文件进行读写时都会反复弹出诸如“文件已被修改,是否重新加载?”、“文件修改失败,是否保存?”一类的提示,很是恼人。
    可行性级低,否决。

    如果在 ( ext{windows}) 的话其实好办,直接一个 (getch()) 搞定(但也只能读入一个字符,无法方便快捷的读入所有类型的数据)。
    ( ext{NOI Linux}) 就头疼了——没有 ( ext{conio.h}) 库。
    此方案也作废。

    后来意识到问题可能出在输入输出流,于是搞了各种奇怪的代码关闭流,还是以失败告终。

    在网上翻阅了很久,后来发现是居然是 ( ext{fclose(stdin)})的锅!

    玩意儿说是可以用来关闭文件关联,实际上貌似没 (jb) 用?

    总之,必须要重定向一个新文件才能真正“关闭”之前打开的文件。

    最终解决方案:在从文件中读入数据后,紧跟一个freopen 把文件关联到控制台,将读入数据的地方重新搞回到控制台上面。

    【Code for Windows】

    freopen("CON","r",stdin);
    

    问题又来了,( ext{Linux}) 下的控制台肯定不再是 CON

    又在网上翻了好久好久,大多数人都说是 /dev/console,而实际上应该是 /dev/tty 才对!

    自闭 ing...

    【Code for Linux】

    freopen("/dev/tty","r",stdin);
    

    tnd大半夜地搞死我了

    希望以后不要有人再像我一样,在这种事情上花大量时间了.....

    【参考资料】

  • 相关阅读:
    从aop中获取被拦截方法中的参数
    使用多线程 执行有返回值的方法
    MyBatis中#{}和${}的区别
    Java 调用api,json化结果
    Spring入门
    实用: 将程序的内容写出到excel中
    实用:Java基础流计算
    2020年7月12号笔记
    2020年7月11号笔记
    2020年7月6号笔记
  • 原文地址:https://www.cnblogs.com/Xing-Ling/p/13369760.html
Copyright © 2020-2023  润新知