2009-11-14 9 views
7
$cc a.c 
$./a.out < inpfilename 

में इनपुट के रूप में रीडायरेक्ट किया गया है, मैं stdout पर inpfilename मुद्रित करना चाहता हूं। मैं यह कैसे कर सकता हूं? अग्रिम सहायता के लिए धन्यवाद ...सी में मैं फ़ाइल के फ़ाइल नाम को कैसे मुद्रित करूं जो शेल

उत्तर

11

आप फ़ाइल नाम बिल्कुल इनपुट के रूप में नहीं प्राप्त कर सकते हैं; खोल आपको बताए बिना सभी पुनर्निर्देशन सामग्री को संभालेगा।

एक सीधा < file पुनर्निर्देशन के मामले में, आप fstat का उपयोग कर एक आइनोड संख्या यह तो find/-inum की तरह ही फ़ाइल पदानुक्रम चलने के लिए एक रास्ता है कि यह मेल खाता प्राप्त करने के लिए प्राप्त करने के लिए द्वारा stdin के साथ जुड़े एक filepath प्राप्त कर सकते हैं। (लिंक के कारण एक से अधिक ऐसे फ़ाइलपैथ हो सकते हैं।)

लेकिन आपको इसे कभी करने की आवश्यकता नहीं है। जैसा कि अन्य ने कहा है, अगर आपको फाइलनामों को जानना है तो आपको तर्क के रूप में फाइलनाम लेना चाहिए।

+3

'एक filepath पुनः प्राप्त' आपरेशन दुष्टता के साथ महंगा होने की संभावना है - दोगुना इसलिए यदि आप एनएफएस घुड़सवार फाइल सिस्टम की अधिकता को स्कैन करने के लिए है। इसके अलावा, जैसा कि संकेत दिया गया है, यह आपको जवाब नहीं दे सकता है; पाइप कनेक्शन, उदाहरण के लिए, फ़ाइल सिस्टम में बस कोई नाम नहीं है। –

+0

हां, वास्तव में। यह सब दौर खो गया है। – bobince

4

आप ऐसा क्यों करना चाहते हैं? आपके सभी प्रोग्राम a.out को खोल से पास किया गया है, एक खुली फ़ाइल डिस्क्रिप्टर है, stdin।

उपयोगकर्ता के रूप में अच्छी तरह से यह कर सकता है:

cat inpfilename | ./a.out 

और अब आप पूरी तरह से उपयोग करने के लिए कोई फ़ाइल नाम (सिवाय/dev/stdin) है।

यदि a.out को फ़ाइल नामों के साथ काम करने की आवश्यकता है, तो फ़ाइल को कमांड लाइन तर्क के रूप में क्यों न लें?

2

केवल माता-पिता के गोले को यह पता चल जाएगा। कार्यक्रम, a.out हमेशा इसे stdin के रूप में देखने जा रहा है।

1

आपका ऑपरेटिंग सिस्टम इस प्रोग्राम से इनपुट के साथ आपके प्रोग्राम की आपूर्ति करेगा। यह आपके कार्यक्रम के लिए पारदर्शी है, और इस तरह आपको फ़ाइल का नाम नहीं दिखता है। वास्तव में, कुछ परिस्थितियों में आप इनपुट जो एक फ़ाइल से नहीं आता है, इस जैसे खिलाया जा जाएगा:

ls | ./a.out 

क्या आप के बाद कर रहे हैं बहुत प्रणाली विशेष है। शायद एक बेहतर समाधान फ़ाइल नाम को पैरामीटर के रूप में पास करना है। इस तरह आप फ़ाइल नाम प्राप्त करते हैं, और आप सामग्री को पढ़ने के लिए इसे खोल सकते हैं।

0

जैसा कि आप इसे एक प्रक्रिया में डालते हैं, उस फ़ाइल के फ़ाइल नाम की कोई धारणा नहीं है जो 'मानक इनपुट प्रदान करती है।

मंगलाचरण किया जाना चाहिए:

$ ./a.out inputfilename 

और int main(int argc, char* argv[]) { ... }

या

$ ./a.out <<< "inputfilename" 

में argv पार्स और stdin से फ़ाइल नाम मिलता है।

फिर एसी में आपको fopen की आवश्यकता है जो फ़ाइल को इसकी सामग्री को पढ़ने के लिए है।

0

मुझे नहीं लगता कि यह संभव है, क्योंकि < बस inpfilename की सामग्री STDIN को पढ़ता है।

यदि आप अपने प्रोग्राम में inffilename उपलब्ध होना चाहते हैं, लेकिन आप एसटीडीआईएन से डेटा स्वीकार करने में सक्षम होना चाहते हैं, तो फ़ाइल प्रोग्राम को स्वीकार करने के लिए अपना प्रोग्राम सेट अप करें और उसे फ़ाइल में फॉपेन करें। यदि कोई तर्क नहीं दिया जाता है तो अपनी फ़ाइल में STDIN असाइन करें। फिर आपके इनपुट रीडिंग रूटीन स्कैनफ के बजाए fscanf जैसे फ़ंक्शंस का उपयोग करता है, और आपके द्वारा पास की जाने वाली फ़ाइल या तो fopened फ़ाइल या STDIN का लिंक है।

0

एक fstat(0,sb) (0 stdin फ़ाइल की जानकारी देता है) इनपुट फ़ाइल पर आपको जानकारी दे देंगे, आकार, अनुमतियाँ (मोड कहा जाता है) और डिवाइस के inode उस पर रहता है।

वैसे भी आप अपने रास्ते बताने के लिए सक्षम नहीं होगा: के रूप में यूनिक्स inodes पता नहीं क्या पथ वे संबंध रखते है, और तकनीकी रूप से (ln देखें) वे एक से अधिक एक पथ के हैं सकता है।

0

G'day,

जैसा कि ऊपर उत्तर पूरी तरह आप देख खुली हुई फ़ाइल वर्णनकर्ता stdin है में बताया।

यदि आप वास्तव में ऐसा करना चाहते हैं, तो आप निर्दिष्ट कर सकते हैं कि इनपुट फ़ाइल की पहली पंक्ति फ़ाइल का नाम होना चाहिए।

HTH

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