2011-06-28 14 views
7

मैं निम्नलिखित समस्या है।C++ linux प्रणाली आदेश

लेकिन मैं निरंतर मूल्य नहीं चाहता हूं। मैं ऐसा:

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 int चाहता हूं और मैं फ़ाइल में सिस्टम फ़ंक्शन के साथ मूल्य प्रिंट करना चाहता हूं। मेरे file.txt का वास्तविक पथ/proc/acpi/video/NVID/LCD/चमक है। मैं fprintf के साथ नहीं लिख सकता। मुझे नहीं पता क्यों।

+0

आप कई बहु भाषा स्रोत फ़ाइलें लिखने की कोशिश कर समस्याओं को खोजने के लिए जा रहे हैं का उपयोग कर के बारे में क्या। मेरा सुझाव है कि आप सी या सी ++ में से केवल 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); 

man snprintf

8

system समारोह एक स्ट्रिंग लेता है। आपके मामले में यह उस चर की सामग्री के बजाय पाठ * curr_val_str * का उपयोग कर रहा है। बल्कि sprintf का उपयोग कर बस संख्या उत्पन्न करने की तुलना में, इसका इस्तेमाल पूरे सिस्टम आदेश है कि आप की आवश्यकता होती है, अर्थात

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

पहला यह है कि आदेश सुनिश्चित काफी बड़ी है उत्पन्न करने के लिए।

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

सुरक्षा समस्याओं से बचने के लिए snprintf का उपयोग करें।

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

आप के बजाय सी ++ के iostreams सुविधा का उपयोग कर 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()); 
0

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

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