171

とにリダイレクトcinするにはどうすればよいですか?in.txtcoutout.txt

4

8 に答える 8

259

これがあなたがやりたいことの実例です。コメントを読んで、コードの各行の機能を確認してください。私はgcc4.6.1を使用してPCでテストしました。それはうまくいきます。

#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
}

次のように、1行で保存してリダイレクトできます。

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

ここでは、バッファをにstd::cin.rdbuf(in.rdbuf())設定してから、に関連付けられている古いバッファを返します。まったく同じことを、またはそのことについては任意のストリームで行うことができます。std::cin'sin.rdbuf()std::cinstd::cout

お役に立てば幸いです。

于 2012-04-14T05:30:29.473 に答える
96

書くだけ

#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
    freopen("output.txt","w",stdout);
    cout<<"write in file";
    return 0;
}
于 2012-12-15T00:46:59.363 に答える
28

プログラミングコンテストに役立つcin/coutをシャドウイングするための短いコードスニペットを次に示します。

#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;
}

これにより、プレーンなfstreamが同期されたstdioストリームよりも高速であるという追加の利点が得られます。ただし、これは単一関数のスコープに対してのみ機能します。

グローバルcin/coutリダイレクトは次のように記述できます。

#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();
}

ios_base::sync_with_stdioもリセットされることに注意してくださいstd::cin.rdbuf。したがって、順序が重要です。

ios_base :: sync_with_stdio(false);の重要性も参照してください。cin.tie(NULL);

Std ioストリームは、単一ファイルのスコープに対して簡単にシャドウイングすることもできます。これは、競技プログラミングに役立ちます。

#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();
}

ただし、この場合、std宣言を1つずつ選択using namespace std;し、あいまいなエラーが発生するので回避する必要があります。

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
                   ^

「 C++で名前空間を適切に使用するにはどうすればよいですか?」も参照してください。、「名前空間stdの使用」が悪い習慣と見なされるのはなぜですか?C ++名前空間とグローバル関数の間の名前の衝突を解決するにはどうすればよいですか?

于 2016-07-21T12:56:01.147 に答える
14

コンパイルプログラム名がx.exeで、$がシステムシェルまたはプロンプトであると仮定します

$ x <infile >outfile 

infileから入力を受け取り、outfileに出力します。

于 2014-09-21T20:33:58.137 に答える
9

これを試して、 coutをファイルにリダイレクトします。

#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;
}

記事全文を読むstd::rdbufを使用してcinとcoutをリダイレクトする

于 2018-06-01T19:35:33.910 に答える
0

入力ファイルがin.txtの場合、freopenを使用してstdinファイルをin.txtとして設定できます。

freopen("in.txt","r",stdin);

出力で同じことをしたい場合:

freopen("out.txt","w",stdout);

これは、std :: cin(c ++を使用している場合)、printfなどで機能します。

これは、clion、vscodeでコードをデバッグするのにも役立ちます


stdinをリセットする場合は編集

fclose(stdin);
stdin = fdopen(0, "r"); //reopen: 0 is file descriptor of std input

とstdoutをリセットします

fclose(stdout);
stdout = fdopen(1, "w"); //reopen: 1 is file descriptor of std output
于 2021-01-20T08:31:02.563 に答える
0

受け入れられた答えは、リダイレクトする正しい方法を示していcinますcoutcinまたはの寿命を超える寿命を持つ別のストリームオブジェクトを作成する必要がありますcout。のようfreopenに機能する関数を作成する場合は、リダイレクトするストリームごとに配列を割り当てて、割り当てられたストリームオブジェクトを保存できます。

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

using namespace std;

template<typename>
    struct fstream_traits { };
template<typename CharT, typename Traits>
    struct fstream_traits<basic_istream<CharT, Traits>> { using type = basic_ifstream<CharT, Traits>; };
template<typename CharT, typename Traits>
    struct fstream_traits<basic_ostream<CharT, Traits>> { using type = basic_ofstream<CharT, Traits>; };

template <typename Stream>
void redirect(Stream& str, string filename)
{
    using fstream_type = typename fstream_traits<Stream>::type;
    static int index = std::ios_base::xalloc();
    if (str.pword(index) == nullptr)
    {
        str.pword(index)= new vector<ios_base*>{};
        str.register_callback([](ios_base::event event, std::ios_base& stream, int index) {
            if (event == ios_base::erase_event)
            {
                for (auto fs : *(vector<ios_base*>*)stream.pword(index))
                    delete fs;
                delete (vector<ios_base*>*)stream.pword(index);
            }
        }, index);
    }
    vector<ios_base*>* list = (vector<ios_base*>*)str.pword(index);
    list->push_back(new fstream_type{filename});
    str.rdbuf(dynamic_cast<fstream_type*>(list->back())->rdbuf())->~basic_streambuf();
}

int main()
{
    redirect(cout, "out.txt");
    cout << "Redirected text!";
    return 0;
}

の代わりにistream/を明示的に使用する場合、テンプレートとエイリアスは必要ありません。ostreamStream

于 2022-02-11T18:12:51.927 に答える
-1

C++でのI/Oリダイレクト

https://www.geeksforgeeks.org/io-redirection-c/

// Cpp program to redirect cout to a file
#include <fstream>
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    fstream file;
    file.open("cout.txt", ios::out);
    string line;
 
    // Backup streambuffers of  cout
    streambuf* stream_buffer_cout = cout.rdbuf();
    streambuf* stream_buffer_cin = cin.rdbuf();
 
    // Get the streambuffer of the file
    streambuf* stream_buffer_file = file.rdbuf();
 
    // Redirect cout to file
    cout.rdbuf(stream_buffer_file);
 
    cout << "This line written to file" << endl;
 
    // Redirect cout back to screen
    cout.rdbuf(stream_buffer_cout);
    cout << "This line is written to screen" << endl;
 
    file.close();
    return 0;
}
于 2021-05-31T08:16:33.393 に答える