hola, estoy tratando de tomar los datos de los archivos en una carpeta con la función del sistema, este es el código
char path[100],command[120]; scanf("%s",&path); sprintf(command,"echo $(ls %s) > something.txt",path); system(command);pero cuando miro algo.txt no hay una nueva línea. Esta es la salida, todo en una línea con muchos nombres de archivos omitidos:
acpi adjtime adobe apparmor.d arch-release asound.conf ati at-spi2 avahi bash.bash_logout ... wpa_supplicant X11 xdg xinetd.d xml yaourtrc Probé -e -E -n opciones de eco pero no funcionó. ¿Cómo hacer una nueva línea después de cada uno de estos archivos?
No deberías usar echo . haz solo
sprintf(command,"ls %s > something.txt",path); system(command); Cuando usa echo , envía todos los argumentos de la línea de comando a la salida estándar, uno por uno, separados por el carácter de espacio. El carácter de nueva línea (que es la salida del comando ls ) funciona como un separador de argumentos, al igual que el espacio.
Hay una nueva línea, que es de esperar. El comando echo imprime todos sus argumentos en una sola línea separados por espacios, que es el resultado que ve.
Necesitas ejecutar el resultado de:
echo "$(ls %s)" para conservar las nuevas líneas en la salida de ls . Consulte Captura de salida de varias líneas en una variable de Bash .
Usar:
snprintf(command, sizeof(command), "echo \"$(ls %s)\" > something.txt", path);` Por supuesto, el echo es redundante; sería mejor simplemente ejecutar:
ls %sy por lo tanto:
snprintf(command, sizeof(command), "ls %s > something.txt", path);Si mantiene el eco, debe preocuparse por el hecho de que tiene más de 20 caracteres adicionales en la cadena de formato, por lo que 120 debería ser más como 130 si no 140.
También debe usar scanf("%99s", path) (sin ampersand; agregar límite de longitud) e idealmente verificar que funcionó ( if (scanf(...) == 1) { ... OK ... } ).