2

Estoy trabajando en un proyecto donde tengo que ejecutar un comando e imprimir la salida. Uso popen, y sirve, pero la salida no muestra los saltos de linea, si no, que muestra todo como uno solo renglón.

Mi código:

#include <iostream>
#include <string.h>
#include <stdio.h>

int main () {
    FILE *output;
    string sys;
    char line[200];
    output = popen("ls -l", "r");
    while ( !feof(output) ){
        fgets(line, 180, output);
        cout << line;
    }
    return 0;
}

la salida que me da es algo como esto:

-rw-r--r-- 1 root www-data 0 Sep 6 10:40 WebSS_06_Sep_10:40:19.in -rw-r--r-- 1 root www-data 0 Sep 6 10:40 WebSS_06_Sep_10:40:31.in -rw-r--r-- 1 root www-data 0 Sep 6 10:40 WebSS_06_Sep_10:40:32.in

pero quisiera que se viera como lo muestra la consola normalmente

-rw-r--r-- 1 root www-data 0 Sep 6 10:40 WebSS_06_Sep_10:40:19.in 
-rw-r--r-- 1 root www-data 0 Sep 6 10:40 WebSS_06_Sep_10:40:31.in 
-rw-r--r-- 1 root www-data 0 Sep 6 10:40 WebSS_06_Sep_10:40:32.in

Estaba pensando, si tal vez separar la cadena cada espacio y que me imprima 8 de esas subcadenas en cada linea o no se si exista una forma mas fácil de hacerlo.

Juan Salvador Portugal
  • 6,565
  • 8
  • 19
  • 41

1 Answers1

3

Has etiquetado la pregunta como C++ así que deberías usar dicho lenguaje correctamente.

Las cabeceras <string.h> y <stdio.h> son de no de . Estas cabeceras disponen de una versión adaptada a C++ que tiene el prefijo c y carece de extensión. Si realmente necesitas usar las cabeceras de C (que nunca será el caso) debes usar los equivalentes de C++ <cstring> y <cstdio> . Lee este hilo para saber por qué.

Veo también que estás usando std::cout sin preceder el espacio de nombres, posiblemente hayas incluido en alguna parte de tu código la cláusula using namespace std. Respecto a esta cláusula, si decides usarla no lo hagas en el ámbito global, úsala en el ámbito más pequeño posible. Lee este hilo para saber por qué.

La función std::fgets.

Si consultamos la documentación de std::fgets (traducción y resaltado míos):

std::fgets

Definida en la cabecera <cstdio>

char* fgets( char* str, int count, std::FILE* stream );

Lee hasta count - 1 caracteres del flujo de datos de archivo facilitado y los guarda en la formación de caracteres apuntada por str. La lectura finaliza si se alcanza el end-of-file o si se encuentra un carácter de nueva línea, en cuyo caso str contendrá dicho carácter.

Dado que la lectura de datos mediante std::fgets incluye el carácter de nueva línea (\n) si está presente, la única explicación es que tus datos de origen carecen de dicho carácter. Podemos corroboralo consultando el manual del comando ls (traducción y resaltado míos):

10.1 ls: listar contenido del directorio

[...]

Por defecto, la salida se ordena alfabéticamente, acorde con los ajustes de idioma activos. Si la salida es a terminal, la salida se muestra en columnas (ordenadas verticalmente) y los caracteres de control se muestran como interrogaciones; en caso contrario, la salida se lista una por línea y los caracteres de control se muestran en crudo.

Dado que no estás mostrando los datos por consola, se mostrará cada salida en una sola línea.

Intenta modificar la llamada al comando ls para forzar que la salida sea por líneas, con algún parámetro .

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • lo que pasa es que en este caso use ls como ejemplo, pero es para otro comando de un manejador de tareas llamado SLURM, entonces tengo que buscar la forma dar los saltos de lineas desde el codigo – fabian andres leon perez Sep 13 '18 at 14:53
  • Tendrás que leer el manual. – PaperBirdMaster Sep 13 '18 at 18:17
  • gracias por tu respuesta, no creo que aporte mucho, con todo el respeto. creo que cada uno podria encontrar la respuesta a todo leyendo, solo que queda algo complejo tratar de buscar algo de lo que ni conoces. – fabian andres leon perez Sep 13 '18 at 20:40
  • Con todo el respeto, la respuesta aporta a lo que pregunta requiere. Si preguntas por `ls` tendrás una respuesta sobre `ls`... si preguntas sobre algo que no comentas hasta pasados 7 días tras tu pregunta, y de lo que no aportas detalles, lo único que puedo decirte es: Lee el manual. – PaperBirdMaster Sep 14 '18 at 05:51