Respostas:
Aqui está um exemplo prático do que você deseja fazer. Leia os comentários para saber o que cada linha do código faz. Eu testei no meu pc com o gcc 4.6.1; Funciona bem.
#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
}
Você pode salvar e redirecionar em apenas uma linha como:
auto cinbuf = std::cin.rdbuf(in.rdbuf()); //save and redirect
Aqui std::cin.rdbuf(in.rdbuf())
define std::cin's
buffer para in.rdbuf()
e, em seguida, retorna o buffer antigo associado std::cin
. O mesmo pode ser feito com std::cout
- ou qualquer fluxo para esse assunto.
Espero que ajude.
in
e out
para ler e escrever para in.txt
e out.txt
respectivamente. Além disso, os arquivos serão fechados automaticamente quando in
e ficarão out
fora do escopo.
freopen
porque não consigo mais me stdout
recuperar se eu usar freopen
. stackoverflow.com/questions/26699524/…
Apenas escreva
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
freopen("output.txt","w",stdout);
cout<<"write in file";
return 0;
}
stdout
, não cout
.
std::sync_with_studio(false);
, embora por padrão esteja definido como true
.
ofstream out("out.txt"); cout.rdbuf(out.rdbuf());
- apenas uma linha extra e é portátil. Não soooo muito mais simples :)
Aqui está um trecho de código curto para sombreamento cin / cout útil para programar concursos:
#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;
}
Isso oferece um benefício adicional de que os fluxos simples são mais rápidos que os fluxos stdio sincronizados. Mas isso funciona apenas para o escopo da função única.
O redirecionamento global cin / cout pode ser escrito como:
#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();
}
Observe que ios_base::sync_with_stdio
também redefine std::cin.rdbuf
. Então a ordem é importante.
Consulte também Significado da ios_base :: sync_with_stdio (false); cin.tie (NULL);
Os fluxos Std io também podem ser facilmente sombreados no escopo do arquivo único, o que é útil para a programação competitiva:
#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();
}
Mas, neste caso, temos que escolher as std
declarações uma por uma e evitar, using namespace std;
pois isso daria erro de ambiguidade:
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
^
Consulte também Como você usa corretamente os namespaces em C ++? , Por que "usar o namespace std" é considerado uma má prática? e Como resolver uma colisão de nomes entre um espaço para nome C ++ e uma função global?
supondo que o nome do seu programa de compilação seja x.exe e $ seja o shell ou prompt do sistema
$ x <infile >outfile
terá entrada de infile e saída para outfile.
Tente isso para redirecionar o cout para o arquivo.
#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;
}
Leia o artigo completo Use std :: rdbuf para redirecionar cin e cout