2010-11-04 18 views
0

Je me demande pourquoi le morceau de code suivant ne fonctionne pas, semble assez simple, est-ce que je me trompe?
Le résultat est le suivant: fichier créé mais vide, si j'ajoute manuellement des lignes, ces lignes sont affichées avec ce code, mais rien d'autre ne se passe.Lecture et ajout de/à un fichier avec std :: fstream

#include <fstream> 
#include <iostream> 
#include <string> 
using namespace std; 

int main(){ 
    fstream mfile("text.txt", ios_base::in | ios_base::out | ios_base::app); 

    mfile.seekg(ios_base::beg); 
    string line; 
    while(getline(mfile,line)){ 
     std::cout << line << "\n"; 
    } 
    mfile.seekg(ios_base::end); 

    mfile << "Line 1\n"; 
    mfile << "Line 2\n"; 
    mfile << "---------------------------------\n"; 

    mfile.seekg(ios_base::beg); 
    while(getline(mfile,line)){ 
     std::cout << line << "\n"; 
    } 
    mfile.seekg(ios_base::end); 

} 
+1

Est-ce vous essayez d'écrire des choses dans le fichier? Ce code ne le fait pas. – birryree

+0

Que fait mfile << "Line 1 \ n"; 'quand mfile est un fstream? –

Répondre

2

Couple de choses:

Lorsque vous êtes prêt à écrire, vous devez seekp() plutôt que seekg(), à savoir

mfile.seekp(ios_base::end); 

Maintenant, le problème est que les getline() appels fixeront les drapeaux de flux (spécifiquement eof), et par conséquent le flux n'est pas prêt pour d'autres opérations, vous devez d'abord effacer les drapeaux!

essayez ceci:

string line; 
mfile.seekg(ios_base::beg); 
while(getline(mfile,line)){ 
    std::cout << line << endl; 
} 
mfile.seekp(ios_base::end); // seekp 
mfile.clear(); // clear any flags 

mfile << "Line 1" << endl; // now we're good 
mfile << "Line 2" << endl; 
mfile << "---------------------------------" << endl; 

mfile.seekg(ios_base::beg); 
while(getline(mfile,line)){ 
    std::cout << line << endl; 
} 

Aussi, utilisez std :: endl plutôt que "\ n", cela déclenche une chasse d'eau des tampons dans le fichier au convinience de l'OS ...

+0

Correct !!! Les drapeaux étaient le problème. un 'clear()' après que les getlines aient résolu le problème. le seekp n'était pas vraiment nécessaire car je ne modifiais pas du tout le put ptr. Je ne savais pas qu'il y avait un get ptr et un put ptr. :RÉ –