2011-06-28 13 views
7

Mam następujący problem:C++ polecenia Linux

używam w moim programie tej funkcji:

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

to działa dobrze.

Ale nie chcę mieć stałej wartości. I to zrobić:

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

mogę sprawdzić ciąg:

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

Tak, to prawda. , ale system w tym przypadku nie działa i nie zwraca -1. Właśnie wydrukuję ciąg!

Jak przenieść zmienną taką jak liczba całkowita, która zostanie wydrukowana w pliku typu integer, ale nie będzie ciągiem znaków?

Tak więc chcę mieć zmienną int a chcę wydrukować wartość a z funkcją systemową w pliku. Prawdziwą ścieżką do mojego pliku file.txt jest/proc/acpi/video/NVID/LCD/brightness. Nie mogę pisać z fprintf. Nie wiem dlaczego.

+0

Idziesz znaleźć wiele problemów próby zapisu plików źródłowych wielojęzycznych. Sugeruję, abyś trzymał się tylko 1 z C lub C++. – pmg

Odpowiedz

9

Nie można łączyć łańcuchów, jak próbujesz zrobić. Wypróbuj to:

curr_val=60; 
char command[256]; 
snprintf(command, 256, "echo -n %d > /file.txt", curr_val); 
system(command); 
+2

To jest warte +1 tylko dla użycia 'snprintf' zamiast' sprintf'. –

4
#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

8

Funkcja system pobiera ciąg. W twoim przypadku używa on tekstu * curr_val_str * zamiast zawartości tej zmiennej. Zamiast używać sprintf po prostu wygenerować numer, należy go wygenerować całą komendę systemową, która jest potrzebna, to znaczy

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

pierwsze zapewnienie, że polecenie jest wystarczająco duża.

7

Polecenie to jest faktycznie (błędnie) wykonywana w Twoim przypadku jest:

"echo -n curr_val_str > /file.txt" 

Zamiast tego, należy zrobić:

char full_command[256]; 
sprintf(full_command,"echo -n %d > /file.txt",curr_val); 
system(full_command); 
2

Prawidłowy sposób byłby podobny do tego:

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

Użyj snprintf, aby uniknąć problemów związanych z bezpieczeństwem.

2

Po prostu NIE WOLNO. :)

Dlaczego warto skorzystać z usługi system() w przypadku tak prostej operacji?

#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

Czy bierzesz za pomocą C++ 's siłownia iostreams zamiast wydobyć z kieszeni do echo? Na przykład (nie skompilowane):

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

przemian, polecenie przechodzą do system musi być w pełni sformatowane.Coś takiego:

curr_val=60; 
std::ostringstream curr_val_str; 
curr_val_str << "echo -n " << curr_val << " /file.txt"; 
system(curr_val_str.str().c_str()); 
0

Co na temat korzystania std::string & std::to_string ...

std::string cmd("echo -n " + std::to_string(curr_val) + " > /file.txt"); 
std::system(cmd.data());