Scrivi su stdout e reindirizza o scrivi direttamente nel file?

3

Posso vedere due modi per riempire un file vuoto con i dati:

$ run_program arg1 > data_file

o, in particolare, scrivere codice che gestisce un file e scrivere su di esso? vale a dire. un flusso di file?

Quale è meglio implementare?

    
posta user2738698 27.03.2014 - 15:05
fonte

3 risposte

6

Se hai già accesso a un modo conveniente per reindirizzare i dati a un file, ad es. L'operatore > di UNIX, quindi non ha assolutamente senso inserire nel logico la logica di apertura e scrittura di file hard-code.

Anche se vuoi sempre creare un file specifico, puoi semplicemente creare uno script, un alias o una funzione che conosce il nome del file e fa la cosa giusta, lasciando liberi gli altri utenti del programma a quello che vogliono con il loro programma di output . Inoltre, il tuo programma diventa più piccolo e meno complicato, il che è sempre buono.

In breve: scrivere su STDOUT può essere facilmente esteso alla scrittura su un file. L'utilizzo di open() , write() e close() syscalls non può essere facilmente esteso a piping, paging, ignorando, utilizzando un sistema di sola lettura o file system completo, ecc.

    
risposta data 27.03.2014 - 15:13
fonte
2

In senso stretto, la tradizione Unix imporrebbe di trattare solo i flussi di input e output e non duplicherà la funzionalità della scrittura su file già presenti nella shell.

Ma ovviamente, quasi tutte le utility Unix do del mondo reale hanno opzioni per scrivere e leggere file. Ed è dannatamente conveniente che lo facciano! (Inoltre, non tutti lavorano in un ambiente Unix.)

    
risposta data 27.03.2014 - 16:01
fonte
1

Mi piacciono sempre i programmi che offrono un'opzione -o per specificare il file di output. Non significa che non uso mai il reindirizzamento, ma ci sono dei momenti in cui non sono così sicuro su come la linea di comando attuale gestisce la pipe e il reindirizzamento, è fantastico avere l'opzione -o. Ecco un esempio di cui sto parlando:

cat thelist | xargs -I_ myprog -i _ -o _.result

Senza l'opzione -o, non sono sicuro di come eseguire l'output su singoli file con xargs. Inoltre, la codifica non è davvero così complicata:

auto outf = stdout;
if (outputFilename) outf = fopen(outputFilename, "w");
// use outf for output
fprintf(outf, "blabla");
// end of using outf
if (outf != stdout) fclose(outf);
    
risposta data 27.03.2014 - 15:29
fonte

Leggi altre domande sui tag