【问题标题】:How to open Nano and get a string from it in C++?如何在 C++ 中打开 Nano 并从中获取字符串?
【发布时间】:2013-01-08 15:07:29
【问题描述】:

我正在创建一个简单的日志记录程序。当用户在控制台输入log some_file时,程序当前只是简单地接收来自cin的一些基本输入,并将其记录到some_file中。

但是,我不想使用cin 实现我自己的编辑器,而是想打开 Nano 编辑器并让用户在那里编辑他的消息。

然后,当消息完成后,我希望我的 C++ 记录器将其作为字符串接收并继续。

这正是 git 在提交时所做的。

我怎样才能做到这一点?

(最好不使用expect等工具,只使用原始C++代码。)

【问题讨论】:

    标签: c++ linux git command-line-interface nano


    【解决方案1】:

    大多数编辑器都希望使用普通文件,因此您通常会创建一个临时文件,然后通过命令行将该文件的名称传递给编辑器。当编辑器返回时,您将临时文件中的内容复制到您的日志中,然后销毁该文件。

    【讨论】:

      【解决方案2】:

      如果你想使用 Nano 编辑器,那么你需要运行 system() 函数来调用带有临时文件的 Nano。然后稍后删除文件..

      std::string filename = "/tmp/.out." + std::to_string(getpid());
      std::string cmd = "/bin/nano " + filename
      system(cmd.c_str());
      // read from filename
      unlink(filename.c_str());
      

      更新

      如果按照 DevSolar 的建议使用 tmpnam()

      char filename[L_tmpnam];
      tmpnam(filename);
      std::string cmd  = "/bin/nano " + filename
      system(cmd.c_str());
      unlink(filename);
      

      【讨论】:

      • 问题是/tmp 中可能有另一个out.txt 可能对另一个用户具有权限(如果您还不明白,请查看/tmp 上的粘贴位)。最好的选择是让一个库为您创建一个临时文件,例如,命令行中的mktemp 将为您创建一个临时文件。
      • 但是要从 C++ 运行 mktemp,您需要再次依赖 system()。而且您需要知道在运行时创建的文件名。使用 getpid() 会更好吗,其他一些更独特的字符串将其附加到文件名并自己生成。
      • 您可以使用库函数tmpnam(),它为在函数调用时不存在的临时文件提供了一个有点独特的名称。不用说,这也不是 100% 安全的。
      • @Ajith,是的,C++ 中还应该有一个系统 API。我知道它存在于 C 中(但我正在加载要加载的库),所以它必须已经存在于 C++ 中。一个快速的谷歌搜索表明它在stdlib.h 并且被称为mkstemp。所以你冷做它以获得一个真正随机的文件名。但是,是的,我不是有意再次调用系统。
      • mkstemp() 会返回一个文件描述符,所以我认为在这种情况下最好按照 DevSolar 的建议使用 tmpnam()
      【解决方案3】:

      如何打开一个文件(将文件名传递给编辑器),保存然后从程序中读取它?我一直认为 git 的工作方式是一样的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-22
        • 1970-01-01
        相关资源
        最近更新 更多