6

我正在编写一个相当基本的程序供个人使用,但我真的想确保我使用良好的实践,特别是如果我决定以后让它更健壮或其他什么。

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

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

我是否应该将它保存在临时目录中,然后在写入时将其移动,然后在完成时将其移动?我应该使用更高级的文件 i/o 库吗?我只是在想这件事吗?

4

5 回答 5

8

我眼中的最佳实践:

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

我只是在想这件事吗?

你是。如果任务很简单,不要仅仅因为感觉“更专业”而故意做出复杂的解决方案。当您是初学者时,请关注代码的可读性,它将促进您和他人的生活。

于 2013-03-14T20:13:53.573 回答
0

没关系。默认情况下,I/O 使用文件函数完全缓冲stdio,因此您不会在每次调用fprintf. 事实上,在很多情况下,在你调用fclose.

检查 . 的返回fopen,完成后关闭文件等是一个很好的做法。让操作系统和编译器完成他们的工作,使其余部分高效,对于像这样的简单程序。

于 2013-03-14T20:14:13.287 回答
0

如果没有其他程序正在检查是否存在以~/program/csv/output.csv进行进一步处理,那么您正在做的事情就很好。

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

于 2013-03-14T20:15:41.847 回答
0

您可以制作自己的cat, cp,mv练习程序。

于 2013-03-14T20:17:01.600 回答