2013-03-14 11 views
5

私は個人的な使い方のためのかなり基本的なプログラムを書いていますが、実際には良い習慣を使っているかどうかを確認したい、特に後でもっと頑強にすることを決めた場合。CでのファイルI/Oのベストプラクティスは何ですか?

プログラムは引数としていくつかの入力ファイルを受け入れ、ファイルから読み取ったfopen()を使用してファイルを開き、その情報を使用して、出力をいくつかの異なるファイルとしてサブフォルダに保存します。プログラムは~/programで、出力ファイルは~/program/csv/

に保存されている場合例えば、私は、ファイルに直接出力だけ、たとえばoutput = fopen("./csv/output.csv", "w");ため、ループ内fprintf(output,"%f,%f", data1, data2);でそれを印刷し、その後、fclose(output);との緊密なと私は感じますそれは悪い習慣です。

書き込み時に一時ディレクトリに保存する必要がありますか?終了時に移動する必要がありますか?より高度なファイルI/Oライブラリを使用する必要がありますか?私はちょうどこれを完全にoverthinkingですか?

+2

これは単純なことですが、あなたはそれを思い知らされていると思います。ファイルへの唯一のプロセス(またはスレッド)の作成者であれば、余分な作業は必要ありません。 –

+1

ようこそスタックオーバーフロー。あまりにも長い間[FAQ]をお読みください。これは正確な答えがなければ問題になるかもしれません。ほとんどの場合、あなたがやっていることは大丈夫です。一時的なディレクトリはおそらく過剰です。 'fclose()'が機能することを確認したいかもしれません。そうでない場合は、ファイルが正しく作成されていないと想定し、おそらくそれを削除する必要があります。各出力操作を確認することができます。それは理論的に正しい方法です。明らかに、 'fopen()'をチェックする必要があります。 –

答えて

6

ベスト・プラクティス:

  • チェックfopenのすべての呼び出し、エラーのためなどのprintf、プット、関数fprintf、fcloseを
  • 使用GETCHARあなたがしなければならない場合は、関数freadすることができます
  • 利用の場合あなたがバイナリモードで出力ファイルを開く必要があるときに、入力行の長さに
  • 回避任意の限界(malloc関数/ reallocのが必要な場合があります)
  • を知ることができる場合のputchar、あなたがしなければならない場合fwriteの
  • 標準Cを使用すると、conioを忘れてしまいます。それは多くの場合のsillynessに対処するために書くマイティウィリアム・H.によって誤解されるようなprintf ("hello, world\n");ない"\nHello, world"、すなわち時間:-)
  • 改行ではなく、いくつかのテキストの先頭に、行の末尾に属しコマンドシェル。
  • 7ビット以上のASCIIが必要な場合は、Unicodeを選択します(最も一般的なエンコーディングはASCII互換のUTF-8です)。それはあなたが学ぶ必要がある最後のエンコーディングです。コードページとISO-8859- *から離れてください。
+0

私は 'getchar'と' putchar'が "必要ならば"使われるだけの関数だと言う理由を尋ねることはできますか? –

+0

基本的には、チャンクI/O対キャラクタ・バイ・キャラクタI/Oの選択肢です。 {get、put} char()には本質的に間違ったものはありません。 'cat'を再実装すると、文字I/Oを使うことは明らかに最適ではありません。 – Jens

3

私はこれを完全に忘れていますか?

です。タスクが単純な場合は、単に「より専門的」であると感じるため、複雑なソリューションを意図的に作成しないでください。あなたはコードの可読性に焦点を当て、初心者でも、あなたと他人の生活を促進します。

0

いいです。デフォルトではI/Oは完全にバッファされており、stdioというファイル機能を持​​っているため、毎回fprintfの呼び出しでファイルに書き込むことはありません。実際、多くの場合、fcloseに電話するまでは何も書き込まれません。

fopenの戻り値を確認し、終了時にファイルを閉じることをお勧めします。このような単純なプログラムでは、OSとコンパイラが残りの部分を効率的にするようにしましょう。

0

さらなる処理のために他のプログラムが~/program/csv/output.csvの存在をチェックしていない場合、何をしているかは問題ありません。

そうでなければ、tmpfile in stdio.hまたは類似のライブラリ呼び出しを呼び出して得たFILE *に書き込むことを検討し、最後にファイルを最終的なコピー先にコピーすることができます。また、ロックファイルoutput.csv.lckを置いて終了したら削除することもできますが、それは他のプログラムの動作を変更できるかどうかによって異なります。

0

catcpmvのプログラムを実際に作成することができます。私の目には

関連する問題