Системная команда Linux C ++ - PullRequest
7 голосов
/ 28 июня 2011

У меня следующая проблема:

Я использую в своей программе эту функцию:

  system("echo -n 60  > /file.txt"); 

она отлично работает.

Но я не хочу, чтобыпостоянное значение.Я делаю так:

   curr_val=60;
   char curr_val_str[4];
   sprintf(curr_val_str,"%d",curr_val);
   system("echo -n  curr_val_str > /file.txt");

Я проверяю свою строку:

   printf("\n%s\n",curr_val_str);

Да, это правильно.но system в этом случае не работает и не возвращает -1.Я просто печатаю строку!

Как я могу передать переменную как целое число, которое будет напечатано в файле как целое число, но не строка?

Итак, я хочу иметь переменную int a ивывести значение a с системной функцией в файл.Реальный путь к моему файлу file.txt - это / proc / acpi / video / NVID / LCD / яркость.Я не могу писать с помощью fprintf.Я не знаю почему.

Ответы [ 9 ]

9 голосов
/ 28 июня 2011

вы не можете объединять строки, как пытаетесь. Попробуйте это:

curr_val=60;
char command[256];
snprintf(command, 256, "echo -n %d > /file.txt", curr_val);
system(command);
8 голосов
/ 28 июня 2011

Функция system принимает строку.В вашем случае он использует текст * curr_val_str *, а не содержимое этой переменной.Вместо того, чтобы использовать sprintf, чтобы просто сгенерировать число, используйте его для генерации всей требуемой системной команды, то есть

sprintf(command, "echo -n %d > /file.txt", curr_val);

, сначала гарантируя, что команда достаточно велика.

7 голосов
/ 28 июня 2011

Команда, которая фактически (ошибочно) выполняется в вашем случае:

 "echo -n curr_val_str  > /file.txt"

Вместо этого вы должны сделать:

char full_command[256];
sprintf(full_command,"echo -n  %d  > /file.txt",curr_val);
system(full_command);
4 голосов
/ 28 июня 2011
#define MAX_CALL_SIZE 256
char system_call[MAX_CALL_SIZE];
snprintf( system_call, MAX_CALL_SIZE, "echo -n %d > /file.txt", curr_val );
system( system_call );

man snprintf

2 голосов
/ 28 июня 2011

Рассматривали ли вы использование средства iostreams в C ++ вместо обстрела echo? Например (не скомпилировано):

std::ostream str("/file.txt");
str << curr_val << std::flush;

Альтернативно, команда, которую вы передаете system, должна быть полностью отформатирована. Как то так:

curr_val=60;
std::ostringstream curr_val_str;
curr_val_str << "echo -n " << curr_val << " /file.txt";
system(curr_val_str.str().c_str());
2 голосов
/ 28 июня 2011

Просто не надо. :)

Зачем прибегать к system() для такой простой операции?

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int write_n(int n, char * fname) {

    char n_str[16];
    sprintf(n_str, "%d", n);

    int fd;
    fd = open(fname, O_RDWR | O_CREAT);

    if (-1 == fd)
        return -1; //perror(), etc etc

    write(fd, n_str, strlen(n_str)); // pls check return value and do err checking
    close(fd);

}
2 голосов
/ 28 июня 2011

Правильный путь будет похож на это:

curr_val=60;
char curr_val_str[256];
sprintf(curr_val_str,"echo -n  %d> /file.txt",curr_val);
system(curr_val_str);
1 голос
/ 28 июня 2011

Используйте snprintf, чтобы избежать проблем с безопасностью.

0 голосов
/ 13 марта 2016

Как насчет использования std::string & std::to_string ...

std::string cmd("echo -n " + std::to_string(curr_val) + " > /file.txt");
std::system(cmd.data());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...