2016-08-31 1 views
0

Tentative d'insertion d'une chaîne au milieu d'un fichier, à partir de sa fin.Peut être inséré dans un fstream, mais pas dans un iostream

Le code suivant fonctionne avec un fstream, mais pas avec un iostream (dans ce cas, la chaîne de sortie est égale à l'entrée une):

// File contents: "abcdefghijklmnopqrstxyz"; "uvw" missing 

    // 1 - OK 
    //fstream iofs(fPath, ios_base::in | ios_base::out); 

    // 2 - Same output 
    filebuf fileBuffer; 
    iostream iofs(&fileBuffer); // generic output stream 
    fileBuffer.open(fPath.c_str(), ios_base::in | ios_base::out | ofstream::app); 
    iofs.rdbuf(&fileBuffer); 

    iofs.seekg(0, ios_base::end); 
    iofs.seekp(0, ios_base::end); 

    for(int i = 1; i < 20; ++i) 
    { 
     iofs.seekg(-i, std::ios_base::end); 

     char c = char(iofs.peek()); 

     if(c == 't') { 
      iofs.seekp(-i + 1, std::ios_base::end); 
      iofs << "uvw";  // add missing token 
      iofs << "xyz";  // append pre-existing token 
      break; 
     } 
    } 

sortie:
Cas 1: Début = abcdefghijklmnopqrstxyz; Résultat = abcdefghijklmnopqrstuvwxyz
Cas 2: Début = abcdefghijklmnopqrstxyz; Résultat = abcdefghijklmnopqrstxyz

Est-ce que je fais quelque chose de mal, ou je ne peux tout simplement pas faire un insert dans un iostream?

+0

Vérifiez-vous le contenu du flux à la fin ou du fichier? Juste deviner ici, mais peut-être le fstream fait un vidage implicite sur la destruction ou la synchronisation de fichiers et l'iostream pas. Vous pouvez essayer une couleur à la fin. – Hayt

Répondre

3

Un iostream générique n'est pas disponible - pensez au clavier ou à l'imprimante.

Vous ne vérifiez pas le résultat de l'opération seekp. Il échoue probablement et définit le flux dans un état d'erreur. Toute autre tentative de sortie ne fera rien.