我一直在摸索这个问题一段时间,我也无法通过网上冲浪找到任何答案。
问题是我在程序中调用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;
}
答案 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.json
,system(...)
和{{} 1}}调用,您的代码将正常工作。有趣的是,我自己怀疑这可能是问题而我只改变了fopen(...)
的问题,但它仍然无法正常工作(尽管该文件是在传递给system(...)
的位置创建的)。
fopen(...)
,但fopen()不需要绝对路径。所以实际上没有必要让两个函数都被赋予绝对路径。
总之,
再次感谢。 :)
答案 1 :(得分:-1)
这可能是因为系统命令在程序继续执行下一条指令时尚未完成执行,而下一条指令试图从尚未创建的文件中读取。
虽然这不是最好的方法,但暂停一下可能会有所不同,或者至少让你知道这是不是问题。