2013-03-14 19 views
5

Sto scrivendo un programma abbastanza semplice per uso personale, ma voglio davvero assicurarmi di usare le buone pratiche, soprattutto se decido di renderlo più robusto più avanti o qualcosa del genere.Quali sono le migliori pratiche per l'I/O dei file in C?

Per tutti gli effetti, il programma accetta alcuni file di input come argomenti, li apre utilizzando fopen() letti dai file, fa cose con tali informazioni e quindi salva l'output come alcuni file diversi in una sottocartella. ad esempio, se il programma è in ~/program allora i file di output vengono salvati in ~/program/csv/

Ho appena uscita direttamente ai file, ad esempio output = fopen("./csv/output.csv", "w");, stampano su di esso con fprintf(output,"%f,%f", data1, data2); in un ciclo, e poi chiudere con fclose(output); e mi sento così è una cattiva pratica.

Devo salvarlo in una directory temporanea mentre viene scritto e quindi spostato quando è finito? Dovrei usare librerie di i/o file più avanzate? Sto solo pensando completamente a questo?

+2

Per qualcosa di così semplice, penso che tu stia pensando troppo. Se sei l'unico processo (o thread) che scrive sul/i file/i, allora non c'è bisogno di ulteriore lavoro. –

+1

Benvenuti in Stack Overflow. Si prega di leggere [FAQ] prima troppo a lungo. Questa potrebbe essere una domanda senza una risposta precisa. Per la maggior parte, quello che stai facendo va bene. Una directory temporanea è probabilmente overkill. Potresti voler controllare che 'fclose()' funzioni; in caso contrario, si presuppone che il file non sia stato creato correttamente e che probabilmente dovrebbe rimuoverlo. Potresti voler controllare ogni operazione di output; questo è il modo teoricamente corretto di farlo. Ovviamente, devi controllare 'fopen()' da quando ti blocchi se non lo fai. –

risposta

6

Le migliori pratiche nei miei occhi:

  • controllare ogni chiamata a fopen, printf, mette, fprintf, fclose ecc per errori
  • uso getchar se è necessario, fread se potete
  • uso putchar se è necessario, fwrite se si può
  • Evita limiti arbitrari sulla lunghezza della linea di ingresso (potrebbe richiedere malloc/realloc)
  • sapere quando è necessario aprire i file di output in modalità binaria
  • usa Standard C, dimentica conio.h :-)
  • a capo appartengono alla fine di una linea, non all'inizio di un testo, cioè è printf ("hello, world\n"); e non "\nHello, world" come quelli trarre in inganno dal Mighty William H. spesso scrivere per far fronte alla sillyness di la loro shell di comando.
  • se è necessario più di 7 bit ASCII, scegliere Unicode (la codifica più comune è UTF-8 che è compatibile ASCII). È l'ultima codifica che avrai mai bisogno di imparare. Stare lontano da codepage e ISO-8859- *.
+0

Posso chiedere perché dici che 'getchar' e' putchar' sono funzioni che devono essere usate solo "se dobbiamo"? –

+0

Fondamentalmente è solo una preferenza per I/O di grandi blocchi contro I/O carattere per carattere. Non c'è nulla di intrinsecamente sbagliato in {get, put} char(). Se si reimplementa 'cat', l'utilizzo di I/O dei caratteri è ovviamente non ottimale. – Jens

3

Sto solo pensando troppo a questo?

Sei. Se l'attività è semplice, non creare una soluzione complicata di proposito solo perché sembra "più professionale". Mentre sei un principiante, concentrati sulla leggibilità del codice, faciliterà la vita tua e altrui.

0

Va bene. I/O sono completamente bufferati per impostazione predefinita con le funzioni di file stdio, quindi non si scriverà sul file con ogni singola chiamata di fprintf. In molti casi, infatti, non verrà scritto nulla fino a quando non si chiama fclose.

È buona norma controllare il ritorno di fopen, per chiudere i file al termine, ecc. Lascia che il sistema operativo e il compilatore facciano il loro lavoro per rendere il resto efficiente, per programmi semplici come questo.

0

Se nessun altro programma sta verificando la presenza di ~/program/csv/output.csv per un'ulteriore elaborazione, allora quello che stai facendo va bene.

In alternativa, è possibile prendere in considerazione la scrittura su tmpfile in stdio.h o una chiamata di libreria simile a tmpfile in stdio.h o una chiamata di libreria simile e al termine copiare il file nella destinazione finale. Puoi anche mettere giù un file di blocco output.csv.lck e rimuoverlo quando hai finito, ma ciò dipende dal fatto che sei in grado di modificare il comportamento dell'altro programma.

0

È possibile creare i propri programmi cat, cp, mv per esercitarsi.

Problemi correlati