【发布时间】:2016-03-17 22:45:22
【问题描述】:
我一直在为这个问题摸不着头脑,也无法通过网上冲浪找到任何答案。
问题是我在我的程序中调用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;
}
【问题讨论】:
-
你说你可以看到文件被创建(如何?),但是
fopen()返回NULL。是否设置errno?在调用fopen()之前将errno设置为0,然后如果fopen()失败,则在调用后查看其值(或使用perror或strerror以获得可读的错误消息)。 -
@KeithThompson 你不需要清除
errno。 -
@EJP:也许吧,但不会有什么坏处。 C 标准不要求
fopen在失败时设置errno,但 POSIX 需要。 -
@KeithThompson,该文件已创建,因为我可以在目录中看到它,打开它,它在那里工作正常。我用
perror,消息是:No such file or directory。 -
所以你的程序完成后文件就存在了,对吧?您能否更新问题以显示更多代码,至少包括从
system()调用到fopen()调用的所有内容?另外,尝试将1>更改为>(应该做同样的事情,但更惯用);如果这没有帮助,您可以从您的问题中删除该段落。