2011-06-28 5 views
7

私は、次のような問題があります。は、C++ Linuxシステムコマンド

私は私のプログラムでは、この機能を使用します。

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を持ちたいと思いますし、ファイル内のシステム関数の値を出力したいと思います。私のfile.txtへの実際のパスは、/ proc/acpi/video/NVID/LCD/brightnessです。私はfprintfで書くことができません。どうしてか分かりません。

+0

あなたはマルチ言語のソースファイルを作成しようと、多くの問題を発見しようとしている使用について。私はあなたがCまたはC++の1つに固執することをお勧めします。 – pmg

答えて

9

あなたがしようとしているような文字列を連結することはできません。試してください:

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

これは、 'sprintf'の代わりに' snprintf'を使うために+1の価値があります。 –

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); 

​​

8

system関数は、文字列を取ります。あなたの場合は、その変数の内容ではなく、テキスト* curr_val_str *を使用しています。むしろ最初のコマンドは十分な大きさであることを保証すること、すなわち

、必要な全体のシステムコマンドを生成するためにそれを使用して、ちょうど数を生成する
sprintf(command, "echo -n %d > /file.txt", curr_val); 

sprintfを使用するよりも。

7

実際に(誤って)あなたの場合に実行されるコマンドは次のとおりです。

"echo -n curr_val_str > /file.txt" 

代わりに、あなたが行う必要があります。

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

を正しい方法は、このようになります

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

セキュリティの問題を避けるには、を使用してください。

2

ただしないでください。 :)

なぜこのような簡単な操作のため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

echoに砲撃するのではなく、C++のiostreams機能を使用することを検討しましたか?例えば、(コンパイルされません):

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()); 
0

std::string & std::to_string ...

std::string cmd("echo -n " + std::to_string(curr_val) + " > /file.txt"); 
std::system(cmd.data()); 
関連する問題