2013-08-06 6 views
11

तेज इनपुट के लिए, मैंने पढ़ा है कि आप file-redirection कर सकते हैं और cin इनपुट पहले से सेट किए गए फ़ाइल को शामिल कर सकते हैं।सी ++ फ़ाइल-रीडायरेक्शन

यह सिद्धांत यह

App.exe inputfile outputfile 

निम्नलिखित जहाँ तक मेरा सी ++ प्राइमर पुस्तक में समझा की तरह इस्तेमाल किया जाना चाहिए, निम्नलिखित सी ++ कोड [1] पाठ फ़ाइल से cin इनपुट पढ़ने हो सकता है और नहीं करना चाहिए करना चाहिए [2]

[2]

include <fstream> 
ofstream myfile; 
myfile.open(); 

[1] निम्नलिखित सी ++ कोड ...

की तरह किसी अन्य विशेष संकेत की जरूरत है
#include <iostream> 
int main(){ 
    int val; 
    std::cin >> val; //this value should be read automatically for inputfile 
    std::cout << val; 
    return 0; 
} 

क्या मुझे कुछ याद आ रही है?

+0

हाँ - कि नहीं है कि यह कैसे किया जाना चाहिए उपयोग किया गया। –

उत्तर

17

अपने कोड का उपयोग करने के [1] आप इस तरह अपने कार्यक्रम कॉल करनी होगी:

App.exe <inputfile> outputfile 

तुम भी उपयोग कर सकते हैं:

App.exe <inputfile>> outputfile 

इस मामले में उत्पादन के साथ rewrited नहीं किया जाएगा आदेश के प्रत्येक भाग, लेकिन आउटपुट पहले से ही मौजूदा फाइल में जोड़ा जाएगा।

विंडोज में इनपुट और आउटपुट को पुनर्निर्देशित करने के बारे में अधिक जानकारी आप here पा सकते हैं।


ध्यान दें कि <, > और >> प्रतीक हैं दर्ज किए जाने की शब्दशः — वे सिर्फ इस व्याख्या में प्रस्तुति प्रयोजनों के लिए नहीं हैं। तो, उदाहरण के लिए:

App.exe <file1>> file2 
+5

आप 'App.exe < inputfile >> outputfile' का भी उपयोग कर सकते हैं। अतिरिक्त '>' पर ध्यान दें। इस तरह नई आउटपुट को इसकी पिछली सामग्री को मिटाने के बजाय फ़ाइल में जोड़ा जाएगा। – Kelm

+1

धन्यवाद @ गावी, मैंने सोचा कि < and > का उपयोग एक चर या कुछ इंगित करने के लिए किया गया था। – zurfyx

+0

@ जेरी आपका स्वागत है, बीटीडब्ल्यू अगर आप अपने प्रोग्राम को तेज़ करना चाहते हैं तो आप printf/scanf फ़ंक्शंस का उपयोग कर सकते हैं, या यदि आप वास्तव में डेटा उपयोग को पढ़ने/लिखने में तेजी लाने के लिए fgets/puts कार्यों को लिखना चाहते हैं (लेकिन ऐसा करने के लिए आपको पता है कि आप क्या कर रहे हैं :)) – gawi

5

मूल पुनर्निर्देशन के अलावा >/>> और <

आप std::cin और std::cout भी अनुप्रेषित कर सकते हैं।

निम्नलिखित की तरह

:

int main() 
{ 
    // Save original std::cin, std::cout 
    std::streambuf *coutbuf = std::cout.rdbuf(); 
    std::streambuf *cinbuf = std::cin.rdbuf(); 

    std::ofstream out("outfile.txt"); 
    std::ifstream in("infile.txt"); 

    //Read from infile.txt using std::cin 
    std::cin.rdbuf(in.rdbuf()); 

    //Write to outfile.txt through std::cout 
    std::cout.rdbuf(out.rdbuf()); 

    std::string test; 
    std::cin >> test;   //from infile.txt 
    std::cout << test << " "; //to outfile.txt 

    //Restore back. 
    std::cin.rdbuf(cinbuf); 
    std::cout.rdbuf(coutbuf); 

} 
0

आप executible को कमांड लाइन इनपुट के रूप में फ़ाइल नाम प्रदान कर सकते हैं [मैं सिर्फ सवाल में इस्तेमाल कमांड लाइन तर्क समझा रहा हूँ], लेकिन फिर आप को खोलने की आवश्यकता उन्हें आपके कोड में।

जैसा आप दो आदेश पंक्ति तर्क की आपूर्ति की है अर्थात् inputfile & outputfile

[App.exe inputfile outputfile]

अब अपने कोड में

#include<iostream> 
#include<fstream> 
#include<string> 

int main(int argc, char * argv[]) 
{ 
    //argv[0] := A.exe 
    //argv[1] := inputFile 
    //argv[2] := outputFile 

    std::ifstream vInFile(argv[1],std::ios::in); 
    // notice I have given first command line argument as file name 

    std::ofstream vOutFile(argv[2],std::ios::out | std::ios::app); 
    // notice I have given second command line argument as file name 

    if (vInFile.is_open()) 
    { 
    std::string line; 

    getline (vInFile,line); //Fixing it as per the comment made by MSalters 

    while (vInFile.good()) 
    { 
     vOutFile << line << std::endl; 
     getline (vInFile,line);   
    } 
    vInFile.close(); 
    vOutFile.close(); 
    } 

    else std::cout << "Unable to open file"; 

    return 0; 
} 
+0

कोड एक नकली अंतिम लाइन जोड़ता है। जब अंतिम पठन विफल हो जाता है, तो आप 'virstfile'' पर 'लाइन' लिखते हैं और केवल तभी 'vInFile.good() 'जांचते हैं। लूप में सही क्रम होना चाहिए: 'पढ़ें लाइन, जांचें कि क्या पढ़ा गया है, लिखने की लाइन, गोटो पढ़ा गया' – MSalters

+0

हाँ इसे इंगित करने के लिए धन्यवाद। मैं इसे ठीक कर दूंगा –