163 votes

Comment rediriger cin et cout vers des fichiers ?

Comment puis-je rediriger cin a in.txt y cout a out.txt ?

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/

0voto

Vishal Singh Points 656

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

0voto

Tuff Contender Points 57

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 .

-1voto

Mihir Patel Points 1

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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X