9
votes

en utilisant une variable ifstream pour lire plusieurs fichiers

Duplicaté possible:

C ++ puis-je réutiliser Fstream pour ouvrir et écrire plusieurs Fichiers?

Pourquoi n'est-il pas possible d'utiliser une variable ifstream pour ouvrir un fichier, le lire, puis la fermeture et, après cela, ouvrez un autre fichier, lecture et fermeture, etc.? Comment cela regarderait-il dans le code (disons simplement que chaque fichier a un entier à l'intérieur): xxx

La seule façon dont j'ai résolu le problème créait une autre variable ifstream.


6 commentaires

Qui dit que ce n'est pas possible? Est-ce une question piège?


Avez-vous essayé d'appeler INPUT1.CLEAR (); avant d'ouvrir le fichier suivant?


Ce n'est pas un tour, je suis jolie nouveaub avec C ++ lorsque j'ai utilisé avec mes fichiers, il n'a apparemment pas lu le second. A-t-il fait quelque chose avec des pointeurs?


Désolé, essayé un peu de recherche, mais je n'ai pas trouvé ce fil spécifique


@shookees: Je suppose que ce que j'essayais d'impliquer, c'est que ce n'est pas une bonne approche philosophique des connaissances pour supposer quelque chose d'incertain. Votre question fait de l'hypothèse que c'est impossible, et vous êtes donc défavorisée mentalement parce que vous êtes déjà biaisé contre la solution. Un meilleur moyen de poser des questions sur quelque chose que vous n'êtes pas familier avec est "Où puis-je comprendre comment faire x?"


@Kerreksb +1 pour enseigner Shookes


4 Réponses :


5
votes

invoquer clair () après ferme () sur ifstream objet


0 commentaires

17
votes

Vous pouvez utiliser la même variable, vous devez appeler .clear () code> pour effacer les indicateurs de l'objet avant de les réutiliser:

int k,l;

{
    std::ifstream input1("File1.txt");  
    input1 >> k;
}
{
    std::ifstream input1("File2.txt");  
    input1 >> l;  
}


1 commentaires

De C ++ 0x sur, il n'est pas nécessaire d'appeler ifstream :: Effacer () Parce que la standard spécifie (voir C ++ 0x / 27.9.1.9) Saisie réussie Ifstream :: Open (Open (Open (Open (Open (Clear ().



4
votes

Le code d'origine de la question fonctionne bien:

#include <fstream>
using namespace std;
int main()
{
    int k, l;  
    ifstream input1;  
    input1.open("file1.txt");
    input1 >> k;
    input1.close();  
    input1.open("file2.txt");  
    input1 >> l;  
    input1.close(); 
}


4 commentaires

Je crois que le problème persiste ici.


@shookees La croyance ne suffit pas, je crois. Ce code compile et le programme fonctionne (il lit même les deux exemples de fichiers). Soyez spécifique, donnez des détails, donnez des erreurs. Votre question est loin d'être idéale, difficilement possible de répondre (donc, j'ai obtenu -1 pour critiquer votre question incomplète, gardez la violation).


Je suis désolé, je n'ai pas --1 que cela semble également que mon compilateur n'ait pas échoué la norme la plus récente à cette époque.


@ shookees c'est bon, désolé d'interpréter mal le Downvote, acclamations



2
votes

Bien qu'il soit tout à fait possible de faire ce que vous suggérez (bien que vous deviez peut-être effacer les indicateurs d'erreur du flux si l'extraction échouait), ce n'est pas terriblement élégant. En C ++, vous devriez vous sentir libre de faire de nouveaux objets lorsque vous en avez besoin et de les jeter lorsque vous avez terminé. Peut-être qu'un moyen plus systématique d'écrire ce code est dans une boucle locale:

int result;

while (true)
{
  std::ifstream infile(get_random_file_name());
  if (infile >> n) { break; }
  // "infile" gets destroyed at the end of the scope
}

std::cout << "We found a good file, and it contains: " << n << std::endl;


1 commentaires

Merci, je pourrais essayer de mettre en œuvre dans le code actuel :)