如何在 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 并从中获取字符串?的主要内容,如果未能解决你的问题,请参考以下文章