2010-04-01 10 views
11

devo aprire un file come ofstream e scrivere la prima pagina del fascicolo, preservando rimanenti contenuto del file, che sarà "mosso". Simile a "anteporre" un file.C++ scrivere a fronte lima

Questo è possibile utilizzando lo STL o aumentare?

risposta

5

No non lo è. E questo è stato chiesto qui molte volte prima. Se vuoi farlo devi creare un nuovo file, scrivere i dati "antepone", quindi aprire il file esistente e copiarne il contenuto nel nuovo file.

16

No - la lingua (o libreria) in realtà non fa molta differenza qui. La maggior parte dei file system non lo consente, punto e basta.

Il solito modo per ottenere lo stesso effetto è quello di scrivere i nuovi dati in un nuovo file, quindi copiare i dati nel vecchio file nel nuovo file dopo i dati che hai scritto.

+0

Come si può dire che è impossibile e poi descrivere come farlo? Boost fornisce una libreria filesystem portatile http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/index.htm con 'boost :: remove' che fa in realtà fare la differenza, se si desidera scollegare il vecchio file e crea un nuovo file - non che sia essenziale, o anche un buon modo di implementarlo. OP non ha chiesto una lettera, ha chiesto aiuto. – Potatoswatter

+6

Non descrive come farlo; descrive la soluzione standard per questo problema. – Nate

+0

Uh, essere una soluzione implicherebbe compiere il compito. Più precisamente, usiamo C++ perché è portatile, e la lingua e la libreria * fanno * fanno la differenza perché per risolvere il problema vengono utilizzate caratteristiche molto specifiche. Vedi la mia risposta. – Potatoswatter

1

Una nuova classe iostream può avvolgere tale funzionalità. Questo presuppone che i tuoi dati di antefatto non siano troppo grandi per adattarsi comodamente alla memoria. Usalo come un normale ofstream.

#include <fstream> 
#include <sstream> 
#include <vector> 

class prepend_ofstream 
    : public std::ostringstream { 
    std::filebuf file; 
public: 
    prepend_ofstream() {} 
    prepend_ofstream(char const *name, openmode mode = out) { 
     open(name, mode); 
    } 
    ~prepend_ofstream() { 
     if (is_open()) close(); 
    } 
    void open(char const *name, openmode mode) { 
     if (! file.open(name, mode & binary | in | out)) { 
      setstate(failbit); 
     } 
    } 
    bool is_open() { return file.is_open(); } 
    void close() { 
     if (! is_open()) { 
      setstate(failbit); 
      return; 
     } 
     char *strbuf = &str()[0]; 
     std::vector<char> buf(str().size()); 
     int rdsz; 
     do { 
      rdsz = file.sgetn(&buf[0], buf.size()); 
      file.pubseekoff(-rdsz, cur); 
      file.sputn(strbuf, buf.size()); 
      file.pubseekoff(0, cur); // "update the output sequence" 
      std::copy(&buf[0], &buf[0]+rdsz, strbuf); 
     } while (rdsz == buf.size()); 
     file.sputn(&buf[0], rdsz); 
     if (! file.close()) { 
      setstate(failbit); 
     } 
    } 
}; 

Tipicamente caratteristiche sono aggiunti attraverso nuovo flusso tampone classi, stream non reali, ma in questo caso la nuova funzionalità è in close, che purtroppo non è virtuale.