C中的文件I / O有哪些最佳实践?

时间:2013-03-14 20:07:39

标签: c file io

我正在编写一个供个人使用的相当基本的程序,但我真的想确保我使用好的做法,特别是如果我决定以后更强大或者其他什么。

对于所有意图和目的,程序接受一些输入文件作为参数,使用fopen()从文件读取打开它们,对该信息执行操作,然后将输出保存为子文件夹中的几个不同文件。例如,如果程序在~/program中,则输出文件保存在~/program/csv/

我只是直接输出到文件,例如output = fopen("./csv/output.csv", "w");,在循环中用fprintf(output,"%f,%f", data1, data2);打印到它,然后用fclose(output);关闭,我觉得这是不好的做法

我应该将它保存在临时目录中吗?它会被写入,然后在它完成后移动它?我应该使用更高级的文件i / o库吗?我只是完全过度思考这个吗?

5 个答案:

答案 0 :(得分:7)

我眼中的最佳做法:

  • 检查每次调用fopen,printf,puts,fprintf,fclose等是否有错误
  • 如果必须,请使用getchar,如果可以的话,请使用
  • 如果必须,请使用putchar,如果可以的话,请使用
  • 避免输入行长度的任意限制(可能需要malloc / realloc)
  • 知道何时需要以二进制模式打开输出文件
  • 使用标准C,忘记conio.h: - )
  • 换行符属于某一行的 end ,而不属于某些文本的开头,即它是printf ("hello, world\n");而非"\nHello, world",就像Mighty William H误导的那些经常写,以应对他们的命令外壳的愚蠢。
  • 如果您需要超过7位ASCII,请选择Unicode(最常见的编码是与ASCII兼容的UTF-8)。这是你需要学习的最后一个编码。远离代码页和ISO-8859 - *。

答案 1 :(得分:4)

  

我只是完全过分思考这个吗?

你是。如果任务很简单,不要因为感觉“更专业”而故意制定复杂的解决方案。虽然您是初学者,但专注于代码可读性,它将促进您和他人的生活。

答案 2 :(得分:0)

没关系。默认情况下,I / O使用stdio文件函数进行完全缓冲,因此每次调用fprintf时都不会写入文件。实际上,在许多情况下,在您致电fclose之前,不会写任何内容。

最好检查fopen的返回,完成后关闭文件等等。让操作系统和编译器完成其余的工作,这对于像这样的简单程序。

答案 3 :(得分:0)

如果没有其他程序检查是否存在~/program/csv/output.csv进行进一步处理,那么您所做的就是没问题。

否则,您可以考虑写入通过调用tmpfile in stdio.h或类似库调用获得的FILE *,并在完成时将文件复制到最终目的地。您还可以放下一个锁定文件output.csv.lck并在完成后将其删除,但这取决于您是否能够修改其他程序的行为。

答案 4 :(得分:0)

您可以制作自己的catcpmv计划进行练习。