2015-06-15 9 views
5

ı hi sto triying a prendere i dati di file in una cartella con la funzione di sistema di questo è il codiceCome rendere nuova linea quando si utilizza l'eco di scrivere un file in C

char path[100],command[120]; 
    scanf("%s",&path); 

sprintf(command,"echo $(ls %s) > something.txt",path); 
      system(command); 

ma quando guardo al something.txt non c'è una nuova riga. Questa è l'uscita, il tutto su una riga con molti nomi di file omessi:

acpi adjtime adobe apparmor.d arch-release asound.conf ati at-spi2 avahi bash.bash_logout ... wpa_supplicant X11 xdg xinetd.d xml yaourtrc 

ho provato -e-E-n opzioni di eco, ma non ha funzionato. Come creare una nuova riga dopo ognuno di questi file?

+0

hai provato ** ls -l ** – user1269942

+0

yeb stessa cosa succede –

+0

C'è una nuova linea, che è normale. È necessario eseguire: 'echo" $ (ls% s) "' per preservare le newline nell'output 'ls'. Vedi [Cattura di output su più righe su una variabile di Bash] (http://stackoverflow.com/questions/613572/). Usa: 'snprintf (comando," echo \ "$ (ls% s) \"> something.txt ", percorso);' e ti preoccupi del fatto che hai più di 20 caratteri in più nella stringa, quindi il 120 dovrebbe essere più come 130 se non 140. Dovresti anche usare 'scanf ("% 99s ", path)' (no e commerciale, aggiungi la lunghezza che limita) e idealmente controlla che funzioni ('if (scanf (...) == 1) {... OK ...} '). –

risposta

2

C'è una nuova linea, che è prevedibile. Il comando echo stampa tutti i suoi argomenti su una singola riga separata da spazi, che è l'output che vedi.

è necessario eseguire il risultato di:

echo "$(ls %s)" 

per preservare le nuove righe nella ls uscita. Vedi Capturing multiple-line output to a Bash variable.

Uso:

snprintf(command, sizeof(command), "echo \"$(ls %s)\" > something.txt", path);` 

Naturalmente, il echo è ridondante; sarebbe meglio semplicemente a correre:

ls %s 

e quindi:

snprintf(command, sizeof(command), "ls %s > something.txt", path); 

Se si mantiene l'eco, si dovrebbe preoccupare il fatto che si dispone di più di 20 personaggi extra nella stringa di formato così il 120 dovrebbe essere più simile a 130 se non 140.

Si dovrebbe anche usare scanf("%99s", path) (no e commerciale, aggiungere la limitazione della lunghezza), e controllare idealmente che funzionasse (if (scanf(...) == 1) { ... OK ... }).

+0

Problema laterale: l'uso di 'snprintf()' ha sicuramente dei vantaggi rispetto a 'sprintf()'. Tuttavia, in questo caso, l'uso di 'snprintf()' _ senza controllare il suo valore restituito_ e quindi chiamando 'system (comando)' ignora il problema enorme rimanente che un comando di sistema mal formato potrebbe richiamare. – chux

6

Non utilizzare echo. Fare solo

sprintf(command,"ls %s > something.txt",path); 
system(command); 

Quando si utilizza echo Emette tutti gli argomenti della riga di comando al stdout, uno per uno, separati dal carattere di spazio. Il carattere Newline (che viene emesso dal comando ls) funziona come separatore di argomenti, proprio come lo spazio.

Problemi correlati