2016-08-31 1 views
0

Der Versuch, einen String in der Mitte einer Datei einzufügen, beginnend mit seinem Ende.Kann in einen Stream, aber nicht in einen Iostream eingefügt werden

Der folgende Code arbeitet mit einem fstream, aber nicht mit einem Iostream (in diesem Fall der Ausgabezeichenfolge zu dem Eingang ist gleich eins):

// 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; 
     } 
    } 

Output:
Fall 1: Begin = abcdefghijklmnopqrstxyz; Ergebnis = abcdefghijklmnopqrstuvwxyz
Fall 2: Begin = abcdefghijklmnopqrstxyz; Ergebnis = abcdefghijklmnopqrstxyz

Mache ich etwas falsch, oder ich kann einfach nicht einfügen in einem Iostream?

+0

Überprüfen Sie den Inhalt des Streams am Ende oder der Datei? Ich rate nur hier, aber vielleicht macht der fstream einen impliziten Flush auf Zerstörung oder eine Dateisynchronisation und den Iostream nicht. Sie können eine Spülung am Ende versuchen. – Hayt

Antwort

3

Ein generischer Iostream ist nicht suchbar - denken Sie an Tastatur oder Drucker.

Das Ergebnis der Operation seekp wird nicht überprüft. Es schlägt wahrscheinlich fehl und setzt den Stream in einen Fehlerzustand. Alle weiteren Ausgabeversuche werden dann nichts tun.

Verwandte Themen