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?
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?
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.
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.
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.
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
Non descrive come farlo; descrive la soluzione standard per questo problema. – Nate
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