2013-03-14 8 views
5

Ich schreibe ein ziemlich einfaches Programm für den persönlichen Gebrauch, aber ich möchte wirklich sicherstellen, dass ich gute Praktiken benutze, besonders wenn ich mich entscheide, es später robuster zu machen oder so.Welche Best Practices gelten für Datei-E/A in C?

Für alle Absichten akzeptiert das Programm einige Eingabedateien als Argumente, öffnet sie mit gelesen aus den Dateien, stopft mit dieser Information, und speichert dann die Ausgabe als ein paar verschiedene Dateien in einem Unterordner. zB wenn das Programm in ~/program ist dann die Ausgabedateien gespeichert wird in ~/program/csv/

ich nur Ausgang direkt auf die Dateien, zum Beispiel output = fopen("./csv/output.csv", "w");, mit fprintf(output,"%f,%f", data1, data2); in einer Schleife, um es zu drucken, und schließen Sie dann mit fclose(output); und ich fühle mich einfach Das ist eine schlechte Übung.

Soll ich es in einem temporären Verzeichnis speichern, in das es geschrieben wird, und es dann verschieben, wenn es fertig ist? Sollte ich erweiterte Datei-E/A-Bibliotheken verwenden? Übertreibe ich das nur völlig?

+2

Für etwas so einfach, denke ich, dass Sie es überdenken. Wenn Sie der einzige Prozess (oder Thread) sind, der in die Datei (en) schreibt, ist keine zusätzliche Arbeit erforderlich. –

+1

Willkommen bei Stack Overflow. Bitte lies die [FAQ] zu lange. Dies könnte eine Frage ohne genaue Antwort sein. In den meisten Fällen ist es gut, was du machst. Ein temporäres Verzeichnis ist wahrscheinlich übertrieben. Sie können überprüfen, ob 'fclose()' funktioniert; Wenn nicht, müssen Sie davon ausgehen, dass die Datei nicht korrekt erstellt wurde und sie wahrscheinlich entfernen sollte. Vielleicht möchten Sie jede Ausgabeoperation überprüfen; das ist der theoretisch korrekte Weg. Offensichtlich müssen Sie 'fopen()' überprüfen, da Sie abstürzen, wenn Sie nicht abstürzen. –

Antwort

6

Best Practices in meinen Augen:

  • Überprüfen Sie an jedem Aufruf von fopen, printf, puts, fprintf, fclose usw. für Fehler
  • Verwendung getchar wenn Sie müssen, fread, wenn Sie können
  • Einsatz putchar wenn Sie müssen, fwrite, wenn Sie können
  • vermeiden willkürliche Grenzen Eingangsleitungslänge
  • wissen (vielleicht malloc/realloc erfordern), wenn Sie die Ausgabedateien im binär-Modus öffnen, müssen
  • verwenden Standard C, vergessen conio.h :-)
  • newlines gehören am Ende einer Linie, nicht am Anfang etwas Text, dh es printf ("hello, world\n"); und nicht "\nHello, world" wie die von der Mighty William H. oft täuschen ist, schreiben die sillyness von bewältigen ihre Befehlsshell.
  • Wenn Sie mehr als 7bit ASCII benötigen, wählen Sie Unicode (die gebräuchlichste Codierung ist UTF-8, die ASCII-kompatibel ist). Es ist die letzte Kodierung, die Sie jemals lernen müssen. Finger weg von Codepages und ISO-8859- *.
+0

Kann ich fragen, warum Sie sagen, dass 'getchar' und' putchar' Funktionen sind, die nur "wenn wir müssen" verwendet werden? –

+0

Grundsätzlich ist es nur eine Präferenz für große Chunk-I/O gegenüber Zeichen-I/O. Es gibt nichts an sich falsch mit {get, put} char(). Wenn Sie "Katze" neu implementieren, ist die Verwendung von Zeichen-I/O offensichtlich suboptimal. – Jens

3

Überlege ich das nur völlig?

Sie sind. Wenn die Aufgabe einfach ist, mache nicht absichtlich eine komplizierte Lösung, nur weil sie sich "professioneller" anfühlt. Während du ein Anfänger bist, konzentriere dich auf die Lesbarkeit von Code und es wird dir und anderen das Leben erleichtern.

0

Es ist in Ordnung. Die E/A ist standardmäßig vollständig mit den Dateifunktionen stdio gepuffert, so dass Sie nicht bei jedem einzelnen Anruf von fprintf in die Datei schreiben. In der Tat wird in vielen Fällen nichts geschrieben, bis Sie fclose anrufen.

Es ist eine gute Übung, die Rückgabe von zu überprüfen, um Ihre Dateien zu schließen, wenn Sie fertig sind usw. Lassen Sie das Betriebssystem und den Compiler ihre Arbeit machen, um den Rest effizient zu machen, für einfache Programme wie diese.

0

Wenn kein anderes Programm das Vorhandensein von ~/program/csv/output.csv für die weitere Verarbeitung prüft, dann ist das, was Sie tun, in Ordnung.

Andernfalls können Sie in Betracht ziehen, an eine FILE * schreiben, die durch einen Aufruf an tmpfile in stdio.h oder einen ähnlichen Bibliotheksaufruf erhalten wurde, und wenn Sie fertig sind, kopieren Sie die Datei an das endgültige Ziel. Sie könnten auch eine Sperrdatei output.csv.lck ablegen und entfernen, wenn Sie fertig sind, aber das hängt davon ab, dass Sie das Verhalten des anderen Programms ändern können.

0

Sie können Ihre eigenen cat, cp, mv Programme für die Praxis machen.

Verwandte Themen