如何在 C++ 中打开 Nano 并从中获取字符串?

Posted

技术标签:

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

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

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

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

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

我怎样才能做到这一点?

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

【问题讨论】:

【参考方案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 的工作方式是一样的。

【讨论】:

以上是关于如何在 C++ 中打开 Nano 并从中获取字符串?的主要内容,如果未能解决你的问题,请参考以下文章

使用windows c++ LockFIle() 锁定文件然后从中获取流?

从 hWnd 获取(资源)ID

c++打开外部exe并输入指令

如何在 C++ 中声明一个字符串数组?

如何返回 Promise 并从中获取数据? [复制]

如何在 Debian 中配置 Git 以默认使用 Nano 或 Vim? [复制]