How to redirect cin and cout to files?

后端 未结 5 1518
慢半拍i
慢半拍i 2020-11-22 07:24

How can I redirect cin to in.txt and cout to out.txt?

相关标签:
5条回答
  • 2020-11-22 07:28

    Just write

    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        freopen("output.txt","w",stdout);
        cout<<"write in file";
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-22 07:31

    Try this to redirect cout to file.

    #include <iostream>
    #include <fstream>
    
    int main()
    {
        /** backup cout buffer and redirect to out.txt **/
        std::ofstream out("out.txt");
    
        auto *coutbuf = std::cout.rdbuf();
        std::cout.rdbuf(out.rdbuf());
    
        std::cout << "This will be redirected to file out.txt" << std::endl;
    
        /** reset cout buffer **/
        std::cout.rdbuf(coutbuf);
    
        std::cout << "This will be printed on console" << std::endl;
    
        return 0;
    }
    

    Read full article Use std::rdbuf to Redirect cin and cout

    0 讨论(0)
  • 2020-11-22 07:41

    assuming your compiles prog name is x.exe and $ is the system shell or prompt

    $ x <infile >outfile 
    

    will take input from infile and will output to outfile .

    0 讨论(0)
  • 2020-11-22 07:44

    Here is a short code snippet for shadowing cin/cout useful for programming contests:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main() {
        ifstream cin("input.txt");
        ofstream cout("output.txt");
    
        int a, b;   
        cin >> a >> b;
        cout << a + b << endl;
    }
    

    This gives additional benefit that plain fstreams are faster than synced stdio streams. But this works only for the scope of single function.

    Global cin/cout redirect can be written as:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    void func() {
        int a, b;
        std::cin >> a >> b;
        std::cout << a + b << endl;
    }
    
    int main() {
        ifstream cin("input.txt");
        ofstream cout("output.txt");
    
        // optional performance optimizations    
        ios_base::sync_with_stdio(false);
        std::cin.tie(0);
    
        std::cin.rdbuf(cin.rdbuf());
        std::cout.rdbuf(cout.rdbuf());
    
        func();
    }
    

    Note that ios_base::sync_with_stdio also resets std::cin.rdbuf. So the order matters.

    See also Significance of ios_base::sync_with_stdio(false); cin.tie(NULL);

    Std io streams can also be easily shadowed for the scope of single file, which is useful for competitive programming:

    #include <bits/stdc++.h>
    
    using std::endl;
    
    std::ifstream cin("input.txt");
    std::ofstream cout("output.txt");
    
    int a, b;
    
    void read() {
        cin >> a >> b;
    }
    
    void write() {
        cout << a + b << endl;
    }
    
    int main() {
        read();
        write();
    }
    

    But in this case we have to pick std declarations one by one and avoid using namespace std; as it would give ambiguity error:

    error: reference to 'cin' is ambiguous
         cin >> a >> b;
         ^
    note: candidates are: 
    std::ifstream cin
        ifstream cin("input.txt");
                 ^
        In file test.cpp
    std::istream std::cin
        extern istream cin;  /// Linked to standard input
                       ^
    

    See also How do you properly use namespaces in C++?, Why is "using namespace std" considered bad practice? and How to resolve a name collision between a C++ namespace and a global function?

    0 讨论(0)
  • 2020-11-22 07:50

    Here is an working example of what you want to do. Read the comments to know what each line in the code does. I've tested it on my pc with gcc 4.6.1; it works fine.

    #include <iostream>
    #include <fstream>
    #include <string>
    
    void f()
    {
        std::string line;
        while(std::getline(std::cin, line))  //input from the file in.txt
        {
            std::cout << line << "\n";   //output to the file out.txt
        }
    }
    int main()
    {
        std::ifstream in("in.txt");
        std::streambuf *cinbuf = std::cin.rdbuf(); //save old buf
        std::cin.rdbuf(in.rdbuf()); //redirect std::cin to in.txt!
    
        std::ofstream out("out.txt");
        std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
        std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
    
        std::string word;
        std::cin >> word;           //input from the file in.txt
        std::cout << word << "  ";  //output to the file out.txt
    
        f(); //call function
    
    
        std::cin.rdbuf(cinbuf);   //reset to standard input again
        std::cout.rdbuf(coutbuf); //reset to standard output again
    
        std::cin >> word;   //input from the standard input
        std::cout << word;  //output to the standard input
    }
    

    You could save and redirect in just one line as:

    auto cinbuf = std::cin.rdbuf(in.rdbuf()); //save and redirect
    

    Here std::cin.rdbuf(in.rdbuf()) sets std::cin's buffer to in.rdbuf() and then returns the old buffer associated with std::cin. The very same can be done with std::cout — or any stream for that matter.

    Hope that helps.

    0 讨论(0)
提交回复
热议问题