2011-06-28 46 views
7

Tôi có vấn đề sau đây:C++ hệ thống linux lệnh

tôi sử dụng trong chương trình của tôi chức năng này:

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

nó hoạt động tốt.

Nhưng tôi không muốn có giá trị không đổi. Tôi làm như vậy:

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

tôi kiểm tra chuỗi của tôi:

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

Vâng, đó là đúng. nhưng system trong trường hợp này không hoạt động và không trả lại -1. Tôi chỉ in chuỗi!

Làm cách nào để chuyển biến như số nguyên sẽ được in thành tệp như số nguyên, nhưng không được chuỗi?

Vì vậy, tôi muốn có biến int a và tôi muốn in giá trị của một hàm hệ thống trong tệp. Một đường dẫn thực sự đến file.txt của tôi là/proc/acpi/video/NVID/LCD/độ sáng. Tôi không thể viết với fprintf. Tôi không biết tại sao.

+0

Bạn sẽ tìm thấy nhiều vấn đề cố gắng để viết file nguồn đa ngôn ngữ. Tôi đề nghị bạn chỉ dính vào 1 trong C hoặc C++. – pmg

Trả lời

9

bạn không thể nối các chuỗi như bạn đang cố gắng thực hiện. Hãy thử điều này:

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

Điều này đáng giá +1 chỉ khi sử dụng 'snprintf' thay vì' 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

Các system chức năng phải mất một chuỗi. Trong trường hợp của bạn, nó sử dụng văn bản * curr_val_str * thay vì nội dung của biến đó. Thay vì sử dụng sprintf để chỉ tạo số, hãy sử dụng số đó để tạo toàn bộ lệnh hệ thống mà bạn yêu cầu, tức là

trước tiên đảm bảo lệnh đó đủ lớn.

7

Lệnh đó là thực sự (sai lầm) thực hiện trong trường hợp của bạn là:

"echo -n curr_val_str > /file.txt" 

Thay vào đó, bạn nên làm:

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

Cách đúng sẽ là tương tự như sau:

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

Sử dụng snprintf để tránh các vấn đề bảo mật.

2

Chỉ cần KHÔNG. :)

Tại sao phải sử dụng system() cho một thao tác đơn giản như vậy?

#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

Bạn đã cân nhắc sử dụng cơ sở iostreams của C++ thay vì bắn phá ra echo? Ví dụ: (không được biên dịch):

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

Cách khác, lệnh bạn chuyển đến system phải được định dạng đầy đủ.Một cái gì đó như thế này:

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

gì về việc sử dụng std::string & std::to_string ...

std::string cmd("echo -n " + std::to_string(curr_val) + " > /file.txt"); 
std::system(cmd.data()); 
Các vấn đề liên quan