Comment puis-je rediriger cin
a in.txt
y cout
a out.txt
?
Réponses
Trop de publicités?Si votre fichier d'entrée est in.txt, vous pouvez utiliser freopen pour définir le fichier stdin comme in.txt
freopen("in.txt","r",stdin);
si vous voulez faire la même chose avec votre sortie :
freopen("out.txt","w",stdout);
ceci fonctionnera pour std::cin (si vous utilisez c++), printf, etc...
Cela vous aidera également à déboguer votre code dans clion et vscode.
Modifier
Si vous voulez réinitialiser stdin
fclose(stdin);
stdin = fdopen(0, "r"); //reopen: 0 is file descriptor of std input
et pour réinitialiser stdout
fclose(stdout);
stdout = fdopen(1, "w"); //reopen: 1 is file descriptor of std output
La réponse acceptée montre la bonne façon de rediriger les données. cin
y cout
. Vous devez construire un autre objet stream dont la durée de vie dépasse celle de l'objet stream. cin
o cout
. Si vous voulez écrire une fonction qui fonctionne comme freopen
vous pouvez allouer un tableau pour chaque flux à rediriger, afin de sauvegarder les objets de flux alloués.
#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;
}
Le modèle et l'alias ne sont pas nécessaires si vous utilisez explicitement la fonction istream
/ ostream
au lieu de Stream
.
Redirection des E/S en C++
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;
}
- Réponses précédentes
- Plus de réponses
8 votes
Rediriger cin vers une chaîne de caractères : stackoverflow.com/questions/4925150/redirect-cin-to-a-string - Rediriger cout vers une chaîne de caractères : stackoverflow.com/questions/1162068/