我一直在为这个问题挠头,通过上网也找不到任何答案。
问题是我在程序中调用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()不需要并且需要一个绝对路径。因此,实际上没有必要为这两个函数提供绝对路径。
无论如何
再次感谢。:)
造成这种情况的原因可能是,当程序继续执行下一个指令时,系统命令尚未完成执行,它尝试从尚未创建的文件读取。
虽然这不是最好的方法,但短暂的停顿可能会有所作为,或者至少让你知道这是否是问题所在。