とにリダイレクトcin
するにはどうすればよいですか?in.txt
cout
out.txt
8 に答える
これがあなたがやりたいことの実例です。コメントを読んで、コードの各行の機能を確認してください。私は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's
in.rdbuf()
std::cin
std::cout
お役に立てば幸いです。
書くだけ
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
freopen("output.txt","w",stdout);
cout<<"write in file";
return 0;
}
プログラミングコンテストに役立つ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 ++名前空間とグローバル関数の間の名前の衝突を解決するにはどうすればよいですか?
コンパイルプログラム名がx.exeで、$がシステムシェルまたはプロンプトであると仮定します
$ x <infile >outfile
infileから入力を受け取り、outfileに出力します。
これを試して、 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;
}
入力ファイルが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
受け入れられた答えは、リダイレクトする正しい方法を示していcin
ますcout
。cin
またはの寿命を超える寿命を持つ別のストリームオブジェクトを作成する必要があります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
/を明示的に使用する場合、テンプレートとエイリアスは必要ありません。ostream
Stream
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;
}