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'sbuffer 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.
Preciso fechar os arquivos antes de redefinir cin e cout para o IO padrão?
updogliu
3
@updogliu: Não. Se desejar, você pode usar ine outpara ler e escrever para in.txte out.txtrespectivamente. Além disso, os arquivos serão fechados automaticamente quando ine ficarão outfora do escopo.
Se as respostas tivessem a mesma funcionalidade, o equivalente em C ++ seria ofstream out("out.txt"); cout.rdbuf(out.rdbuf());- apenas uma linha extra e é portátil. Não soooo muito mais simples :)
nevelis
19
Aqui está um trecho de código curto para sombreamento cin / cout útil para programar concursos:
#include<bits/stdc++.h>usingnamespace 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>usingnamespace 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_stdiotambém redefine std::cin.rdbuf. Então a ordem é importante.
Isso não está relacionado ao C ++ e falha em qualquer exemplo não trivial, por exemplo, quando seu programa gera processos filhos que gravam no console. Pelo menos esse é o problema que encontrei quando tentei esse redirecionamento, por isso estou aqui.
ashrasmun
5
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;return0;}
A pergunta foi respondida há quase 6 anos (em 2012), mas você adicionou uma resposta agora em 2018. Sua resposta é igual à resposta aceita. Então, eu estou me perguntando por que você postou isso quando não tinha nada novo para adicionar?
Nawaz
Minha resposta destaca apenas a versão cout especialmente e a resposta detalhada é fornecida no link abaixo.
precisa saber é o seguinte
O que há de novo na sua resposta que não está presente na resposta aceita ?
Nawaz
2
Minha resposta não se mistura redirecionamento de ambos cout e cin, minha versão separa para torná-lo mais legível
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.
Você pode salvar e redirecionar em apenas uma linha como:
Aqui
std::cin.rdbuf(in.rdbuf())
definestd::cin's
buffer parain.rdbuf()
e, em seguida, retorna o buffer antigo associadostd::cin
. O mesmo pode ser feito comstd::cout
- ou qualquer fluxo para esse assunto.Espero que ajude.
fonte
in
eout
para ler e escrever parain.txt
eout.txt
respectivamente. Além disso, os arquivos serão fechados automaticamente quandoin
e ficarãoout
fora do escopo.freopen
porque não consigo mais mestdout
recuperar se eu usarfreopen
. stackoverflow.com/questions/26699524/…Apenas escreva
fonte
stdout
, nãocout
.std::sync_with_studio(false);
, embora por padrão esteja definido comotrue
.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:
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:
Observe que
ios_base::sync_with_stdio
também redefinestd::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:
Mas, neste caso, temos que escolher as
std
declarações uma por uma e evitar,using namespace std;
pois isso daria erro de ambiguidade: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?
fonte
supondo que o nome do seu programa de compilação seja x.exe e $ seja o shell ou prompt do sistema
terá entrada de infile e saída para outfile.
fonte
Tente isso para redirecionar o cout para o arquivo.
Leia o artigo completo Use std :: rdbuf para redirecionar cin e cout
fonte