2013-04-04 3 views
0

J'ai une fonction qui obtient variable ifstream, mais je dois écrire dans ce fichier dans certaines situations. Par exemple.ifstream -> ofstream C++

main() 
{ 
    ifstream dataFile("filename.txt"); 
    foo(dataFile); 
} 

void foo(ifstream &df) 
{ 
    if(df.good()) {...} 
    else { 
    //here I need to write str into the "filename.txt" 
    //but I don't know how to do it properly! 
    } 
} 

Comme je l'imagine, la façon la plus simple est d'obtenir le nom du fichier en quelque sorte de df dans foo() ... Mais comment?

imagine: JE NE PEUX PAS utiliser fstream. Pour une raison quelconque J'ai seulement ifstream & et ne sais pas le nom du fichier. E.g. Je reçois ifstream & à partir d'une fonction de bibliothèque fermée.

+0

Ne pas passer un courant en valeur passe par référence. 'void foo (ifstream & df)' – andre

+0

Pouvez-vous passer le nom de fichier en tant que paramètre à foo? Si vous le pouvez, instanciez simplement un fichier std :: ostream (filename) dans foo et travaillez avec ça. Sinon, vous pouvez remplacer ifstream par fstream (qui prend en charge les deux) en entrée et en sortie. – utnapistim

+2

Ne pouvez-vous pas changer la fonction pour qu'elle prenne 'fstream' au lieu de' ifstream'? Un 'ifstream' est spécifiquement pour * lire * à partir d'un fichier, pas pour écrire. –

Répondre

4

Utilisez fstream plutôt que ifstream:

fstream dataFile("filename.txt",ios::in | ios::out | ios::app); 

Avec cela, vous pouvez lire et écrire dans le fichier.

Et bien sûr, passez votre objet fstream par référence, non par valeur. fstream est non-copiable.

+1

Pas que ce soit approprié ici, ni pertinent à la réponse, mais avec C++ 11, les flux sont mobiles. –

+0

@PeteBecker intéressant de savoir, merci. Bien que je ne vois pas une raison pour laquelle on devrait passer un flux de fichiers en valeur ... Je pense que le gars dans la question passe en valeur juste en raison du manque d'expérience. –

+0

merci pour - je sais. Coquille. –

1

Malheureusement étant donné vos restrictions que vous avez seulement une ifstream et aucun nom de fichier, il n'y a aucun moyen portable pour écrire de nouveau dans ce fichier.

Il peut être des moyens non portables pour résoudre ce problème. Par exemple, certaines implémentations unix peuvent fournir une fonction fd sur l'objet filebuf vous pouvez obtenir de rdbuf dans le ifstream. Windows peut ou non fournir une fonctionnalité similaire. Je vais terminer en notant qu'il semble que vous résolvez le mauvais problème ici, et vous devriez au moins prendre un moment pour visiter votre conception (et pourquoi vous avez besoin d'écrire dans un fichier dont vous n'avez pas le nom connaître).