5 votes

Comment passer d'un fichier fstream à l'autre sans le fermer (fichiers de sortie simultanés) - C++

J'ai un petit problème en C++ que je n'ai pas pu résoudre en naviguant sur internet. Voici mon code (extrait) :

if(File.is_open()) {
    while(!File.eof())  {
        i++;
        getline(File,Line);
        if(i>=2) {                //Skip Headers
            int CharCount=0;
            for(int CharPosition=0; CharPosition<Line.size(); CharPosition++)                       {
                if(Line[CharPosition]==',') {
                    Length=CharPosition;
                    break;
                }
            }
            NameText=Line.substr(0,Length);
            Path= Path_Folder + "\\" + NameText + ".csv";
            if(!CheckExistance(Path.c_str())) {
                fstream Text_File;
            }
            Text_File.open(Path, fstream::in | fstream::out | fstream::app);
            Text_File<<Line<<"\n";
            Text_File.close();
        }
    }
}

Ce code fonctionne bien, mais j'aimerais modifier le fait qu'il ferme le fichier Text_File à chaque fois qu'il entre dans la boucle while.

Fondamentalement, ce programme divise un gros fichier d'entrée en un grand nombre de fichiers plus petits. Au fur et à mesure que mes fichiers plus petits deviennent de plus en plus gros, l'exécution devient de plus en plus lente. (normal). Mon but est donc de laisser tous les petits fichiers ( Text_File ) ouvert en dans cette boucle while et de passer le pointeur fstream (pointeur ?) de un à l'autre.

J'ai essayé d'en changer :

...

NameText=Line.substr(0,Length);
Path= Path_Folder + "\\" + NameText + ".csv";

if(!CheckExistance(Path.c_str())) {
    fstream Text_File;
}

if(!Text_File.open()) {
    Text_File.open(Path, fstream::in |fstream::out | fstream::app);
}

Text_File<<Line<<"\n";
\\Text_File.close();

...

Mais il travaille sur le même Text_File quoi qu'il arrive NameText est. Je suppose donc que le pointeur du fstream Text_File ne change pas. Que dois-je être alors ? Reposer le pointeur ? Comment ?

Merci à tous !

Je ne suis pas sûr que ce soit pertinent, mais je travaille avec Microsoft Visual C++ 2010 Express. De plus, je ne suis pas un programmeur, ni par l'éducation ni par la vie, donc si vous pouvez m'expliquer sans trop de mots avancés, j'apprécierai.

0voto

skuzniar Points 121

La déclaration de contrôle d'existence n'a aucun effet, comme nous l'avons déjà mentionné. Votre intention était peut-être de faire quelque chose comme cela :

if(!CheckExistance(Path.c_str())) {
    fstream Text_File;

    Text_File.open(Path, fstream::in | fstream::out | fstream::app);
    Text_File<<Line<<"\n";
    Text_File.close();
}

Le fstream dans le champ d'application de l'instruction if cachera celui que vous devez avoir dans le champ d'application extérieur. De plus, close est optionnel - le flux sera fermé lorsqu'il sortira de la portée.

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