函数 system() 中的输出重定向似乎不起作用

output redirection in the function system() seems not to work

本文关键字:重定向 不起作用 输出 system 函数      更新时间:2023-10-16

我一直在为这个问题挠头,通过上网也找不到任何答案。

问题是我在程序中调用system("csvtojson someFile.csv 1> someOtherFile.json")来生成 JSON 文件。在这一行之后,我想打开、读取和处理 JSON 文件。虽然,我可以看到文件已创建,但fopen()返回NULL.我读到system()是同步的,所以我认为在system调用完成之前,我的程序的其余部分不会被执行,因此将创建文件。

我怀疑这个问题与使用"1>"重定向输出流有关; 不过不确定。

任何帮助或提示将不胜感激。

谢谢! :)

附言我不想使用库将 csv 转换为 JSON,并且我无法在程序外执行转换,因为有大量非常大的 csv 文件,对我来说唯一的方法是将每个文件转换为程序内的 JSON 文件,运行我的算法,然后移动到下一个 csv 文件(将其转换为 JSON 并将其保存在同一个 JSON 文件中)。所以总的来说,我只有一个 JSON 文件,就像我的 csv 文件的缓冲区。话虽如此,如果有人有更好的设计方法可以快速实现,那也很棒。

更新:显示问题的实际代码,从OP的答案中复制:

int main(){
system("csvtojson Test_Trace.csv 1> ~/Traces/Test_Trace.json");
FILE* traceFile = fopen("~/Traces/Test_Trace.json", "r");
if(traceFile == NULL)
  perror("Error in Openning the trace file");
else
  cout << "Successfull openning of the trace file!" << endl;
 return 0;
}

谢谢你们的回答。我必须在我的问题中更详细,因为问题似乎在我的问题中不清楚的地方。

我想出了问题所在,并想在这里分享(不是一个超级有趣的发现,但值得一提)。

我写了一个简单的程序来查找问题:

int main(){
system("csvtojson Test_Trace.csv 1> ~/Traces/Test_Trace.json");
FILE* traceFile = fopen("~/Traces/Test_Trace.json", "r");
if(traceFile == NULL)
  perror("Error in Openning the trace file");
else
  cout << "Successfull openning of the trace file!" << endl;
 return 0;
}

如果你运行这个程序,你会得到错误消息No such file or directory,但是如果你在system(...)fopen(...)调用中用绝对位置替换地址字符串,即/home/USER_ID/Traces/Test_Trace.json,你的代码将正常工作。有趣的是,我自己怀疑这可能是问题所在,我只更改了一个system(...)但它仍然不起作用(尽管该文件是在传递给fopen(...)的位置创建的)。

编辑:多亏了@Peter的评论,这个问题是因为system()调用会处理~,但fopen()不需要并且需要一个绝对路径。因此,实际上没有必要为这两个函数提供绝对路径。

无论如何

再次感谢。:)

造成这种情况的原因可能是,当程序继续执行下一个指令时,系统命令尚未完成执行,它尝试从尚未创建的文件读取。

虽然这不是最好的方法,但短暂的停顿可能会有所作为,或者至少让你知道这是否是问题所在。