Voici un exemple concret de ce que vous voulez faire. Lisez les commentaires pour savoir ce que fait chaque ligne du code. Je l'ai testé sur mon PC avec gcc 4.6.1; ça fonctionne bien.
#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}
Vous pouvez enregistrer et rediriger en une seule ligne en tant que:
auto cinbuf = std::cin.rdbuf(in.rdbuf());//save and redirect
Ici, std::cin.rdbuf(in.rdbuf())définit le std::cin'stampon sur in.rdbuf(), puis renvoie l'ancien tampon associé à std::cin. La même chose peut être faite avec std::cout- ou n'importe quel flux d'ailleurs.
Dois-je fermer les fichiers avant de réinitialiser cin et cout sur IO standard?
updogliu
3
@updogliu: Non. Si vous le souhaitez, vous pouvez utiliser inet outpour lire et écrire sur, in.txtet out.txtrespectivement. En outre, les fichiers seront fermés automatiquement inet outhors de portée.
Cela redirigera également printf, ce qui dans certains cas peut être une bonne chose.
JDiMatteo
5
@AkshayLAradhya Pas lorsque vous définissez std::sync_with_studio(false);, bien que par défaut, il soit défini sur true.
vsoftco
2
@ PřemyslŠťastný pourquoi?
reggaeguitar
4
Si les réponses étaient égales en fonctionnalités, l'équivalent C ++ de ceci serait ofstream out("out.txt"); cout.rdbuf(out.rdbuf());- une seule ligne supplémentaire, et c'est portable. Not soooo much simpler :)
nevelis
19
Voici un court extrait de code pour l'observation cin / cout utile pour la programmation de concours:
#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;}
Cela donne un avantage supplémentaire que les flux fstream simples sont plus rapides que les flux stdio synchronisés. Mais cela ne fonctionne que pour la portée d'une seule fonction.
La redirection globale cin / cout peut être écrite comme suit:
#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();}
Notez que ios_base::sync_with_stdioréinitialise également std::cin.rdbuf. L'ordre compte donc.
Ce n'est pas lié au C ++ et échoue dans tout exemple non trivial, par exemple lorsque votre programme génère des processus enfants qui écrivent sur la console. Au moins, c'est le problème que j'ai rencontré lorsque j'ai essayé une telle redirection, d'où la raison pour laquelle je suis ici.
ashrasmun
5
Essayez ceci pour rediriger cout vers un fichier.
#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;}
La question avait reçu une réponse il y a presque 6 ans (en 2012), mais vous avez ajouté une réponse maintenant en 2018. Votre réponse est la même que la réponse acceptée. Je me demande donc pourquoi avez-vous publié ceci alors que vous n'aviez rien de nouveau à ajouter?
Nawaz
Ma réponse ne met en évidence que la version cout spécialement et la réponse détaillée est fournie dans le lien ci-dessous.
HaseeB Mir
Qu'y a-t-il de nouveau dans votre réponse qui n'est pas présent dans la réponse acceptée ?
Nawaz
2
Ma réponse ne mélange pas la redirection à la fois cout et cin, ma version se sépare pour la rendre plus lisible
Réponses:
Voici un exemple concret de ce que vous voulez faire. Lisez les commentaires pour savoir ce que fait chaque ligne du code. Je l'ai testé sur mon PC avec gcc 4.6.1; ça fonctionne bien.
Vous pouvez enregistrer et rediriger en une seule ligne en tant que:
Ici,
std::cin.rdbuf(in.rdbuf())
définit lestd::cin's
tampon surin.rdbuf()
, puis renvoie l'ancien tampon associé àstd::cin
. La même chose peut être faite avecstd::cout
- ou n'importe quel flux d'ailleurs.J'espère que cela pourra aider.
la source
in
etout
pour lire et écrire sur,in.txt
etout.txt
respectivement. En outre, les fichiers seront fermés automatiquementin
etout
hors de portée.freopen
celle parce que je ne peux plus récupérerstdout
si j'utilisefreopen
. stackoverflow.com/questions/26699524/…Ecrivez
la source
stdout
, noncout
.std::sync_with_studio(false);
, bien que par défaut, il soit défini surtrue
.ofstream out("out.txt"); cout.rdbuf(out.rdbuf());
- une seule ligne supplémentaire, et c'est portable. Not soooo much simpler :)Voici un court extrait de code pour l'observation cin / cout utile pour la programmation de concours:
Cela donne un avantage supplémentaire que les flux fstream simples sont plus rapides que les flux stdio synchronisés. Mais cela ne fonctionne que pour la portée d'une seule fonction.
La redirection globale cin / cout peut être écrite comme suit:
Notez que
ios_base::sync_with_stdio
réinitialise égalementstd::cin.rdbuf
. L'ordre compte donc.Voir aussi Signification de ios_base :: sync_with_stdio (false); cin.tie (NULL);
Les flux std io peuvent également être facilement masqués pour la portée d'un fichier unique, ce qui est utile pour la programmation compétitive:
Mais dans ce cas, nous devons choisir les
std
déclarations une par une et éviterusing namespace std;
car cela donnerait une erreur d'ambiguïté:Voir aussi Comment utiliser correctement les espaces de noms en C ++? , Pourquoi "utiliser namespace std" est-il considéré comme une mauvaise pratique? et Comment résoudre une collision de noms entre un espace de noms C ++ et une fonction globale?
la source
en supposant que le nom de votre prog de compilation est x.exe et $ est le shell système ou l'invite
prendra l'entrée de infile et sera sortie vers outfile.
la source
Essayez ceci pour rediriger cout vers un fichier.
Lire l'article complet Utilisez std :: rdbuf pour rediriger cin et cout
la source