在我的家用Linux笔记本电脑上,我喜欢为我经常使用的东西编写包装程序和GUI助手。但是,我不太喜欢Bash脚本,所以我在C ++中做了很多东西。但是,很多时候,这需要我使用cstdlib中的system()函数。
这个system()命令很棒,但是我想要一种方法来调用system()并接收stdout / stderror。 system()命令仅返回命令的返回码。因此,在Bash脚本中,可以执行以下操作:
myVar=$(ls -a | grep 'search string')
echo $myVar
并且myVar将输出该命令的stdout。所以我开始编写一个包装类,它将在命令末尾添加一个管道到文件,打开文件,读取所有管道标准输出,并将其作为一个长字符串或字符串向量返回。这个课程的复杂性在这里并不重要(我不管怎么说),但上面的例子会这样做:
SystemCommand systemCommand;
systemCommand.setCommand("ls -a | grep \'search string\' ");
systemCommand.execute();
std::cout << systemCommand.outputAsString() << std::endl;
在幕后,当调用systemCommand.execute()时,该类确保该命令将所有stdout / stderr正确地传输到随机生成的文件名 在当前工作目录中 即可。因此,例如,上述命令最终将成为
"ls -a | grep 'search string' >> 1452-24566.txt 2>&1".
然后,该类尝试使用ifstream打开并读取该文件:
std::ifstream readFromFile;
readFromFile.open(_outputFilename);
if (readFromFile.is_open()) {
//Read all contents of file into class member vector
...
readFromFile.close();
//Remove temporary file
...
} else {
//Handle read failure
}
所以这是我的主要问题std :: ifstream无法在当前工作目录中打开最近创建的文件?如果是这样,那么什么方法可以使它更强大(特别是在Linux上)?
副/次问题:是否有一种非常简单的方法可以实现我在不使用文件管道的情况下实现的目标?也许在unistd.h中可以找到一些东西?谢谢你的时间。
答案 0 :(得分:4)
所以这是我的主要问题是std :: ifstream是否无法在当前工作目录中打开最近创建的文件?
是
cd
到山上还有其他许多原因。文件系统损坏,达到文件描述符限制等等。
如果是这样,那么什么方法可以使其更强大(特别是在Linux上)?
在/tmp
中创建临时文件,其目的是用于临时文件。或者根本不创建文件,而是使用管道进行通信(就像popen
所做的那样,如harmic建议的那样)。即便如此,也没有保证;尝试优雅地处理错误。