功能系统()中的输出重定向似乎不起作用

时间:2016-03-17 22:45:22

标签: c++ io

我一直在摸索这个问题一段时间,我也无法通过网上冲浪找到任何答案。

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

我怀疑问题与使用“1>”重定向输出流有某种关系;但不确定。

非常感谢任何帮助或提示。

谢谢! :)

P.S。我不想使用库将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;
}

2 个答案:

答案 0 :(得分: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,但如果您使用绝对位置替换地址字符串,即/home/USER_ID/Traces/Test_Trace.jsonsystem(...)和{{} 1}}调用,您的代码将正常工作。有趣的是,我自己怀疑这可能是问题而我只改变了fopen(...)的问题,但它仍然无法正常工作(尽管该文件是在传递给system(...)的位置创建的)。

编辑:感谢@ Peter的评论,这个问题是因为s​​ystem()调用负责fopen(...),但fopen()不需要绝对路径。所以实际上没有必要让两个函数都被赋予绝对路径。

总之,

再次感谢。 :)

答案 1 :(得分:-1)

这可能是因为系统命令在程序继续执行下一条指令时尚未完成执行,而下一条指令试图从尚未创建的文件中读取。

虽然这不是最好的方法,但暂停一下可能会有所不同,或者至少让你知道这是不是问题。