2015-06-15 50 views
5

हाय मैं प्रणाली समारोह के साथ एक फ़ोल्डर में फ़ाइलों के डेटा लेने के लिए इस कोड कोजब सी

char path[100],command[120]; 
    scanf("%s",&path); 

sprintf(command,"echo $(ls %s) > something.txt",path); 
      system(command); 

है triying हूँ में एक फ़ाइल में लिखने के लिए गूंज का उपयोग कर नई लाइन बनाने के लिए लेकिन जब मैं करने के लिए लग रही है something.txt कोई नई लाइन नहीं है।

acpi adjtime adobe apparmor.d arch-release asound.conf ati at-spi2 avahi bash.bash_logout ... wpa_supplicant X11 xdg xinetd.d xml yaourtrc 

मैं गूंज के -e-E-n विकल्पों का प्रयास किया था, लेकिन यह काम नहीं किया: यह आउटपुट, सभी छोड़े गए कई फ़ाइल नाम के साथ एक लाइन पर है। इन फ़ाइलों में से प्रत्येक के बाद एक नई लाइन कैसे बनाएं?

+0

क्या आपने ** ls -l ** – user1269942

+0

हाँ की कोशिश की है एक ही चीज होती है –

+0

एक नई लाइन है, जिसकी अपेक्षा की जा सकती है। आपको 'ls' आउटपुट में न्यूलाइन को संरक्षित करने के लिए" echo "$ (ls% s) निष्पादित करने की आवश्यकता है। देखें [बैश वैरिएबल में एकाधिक-लाइन आउटपुट कैप्चर करना] (http://stackoverflow.com/questions/613572/)। उपयोग करें: 'snprintf (कमांड, "echo \" $ (ls% s) \ "> something.txt", पथ); और इस तथ्य के बारे में चिंता करें कि आपके पास स्ट्रिंग में 20 से अधिक अतिरिक्त वर्ण हैं, इसलिए 120 होना चाहिए 140 की तरह 130 की तरह। आपको 'स्कैनफ ("% 99s", पथ)' (कोई एम्परसैंड; लंबाई सीमित करना) का उपयोग करना चाहिए, और आदर्श रूप से जांचें कि यह काम करता है ('if (scanf (...) == 1) {... ठीक है ...} ')। –

उत्तर

2

एक नई लाइन है, जिसकी अपेक्षा की जा सकती है। echo कमांड अपने सभी तर्कों को रिक्त स्थान से अलग एक पंक्ति पर प्रिंट करता है, जो आउटपुट आप देखते हैं।

echo "$(ls %s)" 

ls उत्पादन में नई-पंक्तियों को बचाने के लिये:

आप का परिणाम निष्पादित करने के लिए की जरूरत है। Capturing multiple-line output to a Bash variable देखें।

उपयोग:

snprintf(command, sizeof(command), "echo \"$(ls %s)\" > something.txt", path);` 
बेशक

, echo निरर्थक है; बस चलाने के लिए यह बेहतर होगा:

ls %s 

और इसलिए:

snprintf(command, sizeof(command), "ls %s > something.txt", path); 

आप गूंज रखने हैं, तो आप सच है कि आप प्रारूप स्ट्रिंग में 20 से अधिक अतिरिक्त वर्ण है के बारे में चिंता करना चाहिए ताकि 120 140 नहीं होने पर 130 की तरह अधिक होना चाहिए।

आपको scanf("%99s", path) (कोई एम्परसैंड; लंबाई सीमित करना) का उपयोग करना चाहिए, और आदर्श रूप से जांचें कि यह काम करता है (if (scanf(...) == 1) { ... OK ... })।

+0

साइड इश्यू: 'snprintf() 'का उपयोग करके निश्चित रूप से' sprintf()' पर फायदे हैं। फिर भी इस मामले में, 'snprintf()' _ का उपयोग करके इसके वापसी मूल्य_ की जांच किए बिना और फिर 'सिस्टम (कमांड)' को कॉल करने से शेष बड़ी समस्या को अनदेखा किया जाता है, एक खराब गठित सिस्टम कमांड आ सकता है। – chux

6

आपको echo का उपयोग नहीं करना चाहिए। जब आप echo का उपयोग यह stdout में सभी आदेश पंक्ति तर्क, एक के बाद एक, अंतरिक्ष चरित्र के द्वारा अलग आउटपुट बस

sprintf(command,"ls %s > something.txt",path); 
system(command); 

करो। न्यूलाइन कैरेक्टर (जो ls कमांड का आउटपुट है) एक तर्क विभाजक के रूप में कार्य करता है, बस अंतरिक्ष के रूप में।

संबंधित मुद्दे