Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Guglie
    Registrato dal
    Dec 2002
    Messaggi
    1,572

    [C++] variabile che contiene output di un comando

    ho un programmino che è principalmente in C++, ma si appoggia a uno script in bash: vorrei che il programma in C++ eseguisse questo script e che dirigesse il suo output in una variabile invece che stamparlo sulla shell

    l'output è un numero da 0 a 100: ad esempio 90 e quando eseguo lo script bash con
    codice:
    	string perc = to_string(system("get_battery_percent") );
    	cout << perc << endl;
    ottengo come output
    90
    0
    perchè perc assume lo stato di uscita del programma get_battery_percent

    cercando in google ho trovato soluzioni che indirizzano l'output di system su un file e successivamente lo leggono, ma vorrei evitare di scrivere files sul filesystem soltanto per mettere il contenuto del file (un numero di 2 cifre) in una variabile

    avete qualche idea?
    powered by GNU/Linux Gentoo
    A Elbereth Gilthoniel o menel palan-diriel, le nallon sí di-nguruthos! A tiro nin, Fanuilos!

  2. #2

    Re: [C++] variabile che contiene output di un comando

    Originariamente inviato da Guglie
    [...]
    avete qualche idea?
    Yup, popen()/fread()/pclose() (eventualmente incapsulati in un oggetto)

    [edit]...se sei sotto *nix (stupidamente l'ho dato per scontato nella risposta originale[/edit]
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  3. #3
    Utente di HTML.it L'avatar di Guglie
    Registrato dal
    Dec 2002
    Messaggi
    1,572
    grazie del suggerimento Ikitt: ho cercato un po' in rete e ho trovato un esempio, e adattandolo funziona
    però non ho bene capito come funziona (sono andato un po' a tentativi.. ) e credo che il codice si possa scrivere meglio
    codice:
    FILE * temp_file;
    char perc[53];
    int lastchar;
    
    temp_file = popen("get_battery_percent", "r");
    lastchar = fread(perc, 1, 53, temp_file);
    perc[lastchar-1]=' ';
    perc[lastchar]='%';
    perc[lastchar+1] = '\0';
    cout << "Percentuale " << perc << endl;
    cout << "Fine";
    pclose(temp_file);
    l'output così è
    codice:
    Percentuale 85 %
    Fine
    che è quello che voglio: alla variabile perc aggiungo lo spazio e "%" e non c'è il ritorno a capo (nello script originale c'era soltanto perc[lastchar] = '\0' )
    powered by GNU/Linux Gentoo
    A Elbereth Gilthoniel o menel palan-diriel, le nallon sí di-nguruthos! A tiro nin, Fanuilos!

  4. #4
    Originariamente inviato da Guglie
    grazie del suggerimento Ikitt: ho cercato un po' in rete e ho trovato un esempio, e adattandolo funziona
    però non ho bene capito come funziona (sono andato un po' a tentativi.. )
    Assumendo di parlare di popen usata col secondo parametro pari a "r+", il caso in esame e uno di quelli piu` comuni (e facili ).
    Sostanzialmente, se popen() ha successo, ritorna al chiamante un FILE da cui si puo` leggere normalmente con fgets() o fread(). L'unica differenza da un FILE tradizionale e` che, come desiderato, quel FILE (fittizio) contiene l'output del comando desiderato.
    Il punto, appunto (!) e` che si puo` leggere e scrivere normalmente usando fread & co

    e credo che il codice si possa scrivere meglio
    Forse, dipende da cosa stampa a video "get_battery_percent",
    e cosa devi fare il programma chiamante col valore ottenuto.

    codice:
    FILE * temp_file;
    char perc[53];
    int lastchar;
    
    temp_file = popen("get_battery_percent", "r");
    lastchar = fread(perc, 1, 53, temp_file);
    perc[lastchar-1]=' ';
    perc[lastchar]='%';
    perc[lastchar+1] = '\0';
    cout << "Percentuale " << perc << endl;
    cout << "Fine";
    pclose(temp_file);
    l'output così è
    codice:
    Percentuale 85 %
    Fine
    che è quello che voglio: alla variabile perc aggiungo lo spazio e "%" e non c'è il ritorno a capo (nello script originale c'era soltanto perc[lastchar] = '\0' )
    Non vedo errori (disclaimer: sono sveglio da poco e senza caffe ), mi pare "solo" un errore di "off by one" potenziale in "perc[lastchar+1 = '\0'".
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.