RISOLTO Qual è l'equivalente di PrintWriter.append() in c++?

Stato
Discussione chiusa ad ulteriori risposte.

vyzpup

Nuovo Utente
Salve a tutti, volevo chiedere se esiste un equivalente del metodo append() appartenente alla classe PrintWriter per il C++
Devo scrivere ripetutamente su un file e mi sarebbe comoda una cosa del genere, anche perché dovrebbe essere più veloce (?)
Grazie in anticipo
 

_Achille

Utente Èlite
2,984
682
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
Windows 10 Pro
std::ofstream
Hai sia .operator<<(...) che .write(const char_type *, std::streamsize)
 

vyzpup

Nuovo Utente
Beh non esattamente, usando quei due modi l'output viene mandato immediatamente, invece con io metodo append() del java, l'output non viene inviato finché non viene chiamato il metodo flush()
(Chiedo scusa ma non so usare termini tecnici:asd:, spero di essermi spiegato)
 

_Achille

Utente Èlite
2,984
682
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
Windows 10 Pro
Beh non esattamente, usando quei due modi l'output viene mandato immediatamente, invece con io metodo append() del java, l'output non viene inviato finché non viene chiamato il metodo flush()
(Chiedo scusa ma non so usare termini tecnici:asd:, spero di essermi spiegato)
In realtà nemmeno .operator<<() scrive sul buffer dello stream immediatamente ma quando viene chiamato std::flush (quando il buffer dell’oggetto std::ofstream è pieno, magari con std::endl ma anche "\n" può chiamarlo, dipende dalla implementazione...).

Se vuoi una cosa simile in C++ ti basta una classe con un buffer interno, un metodo append(...) e un metodo flush() che scrive su un file (che gestisce internamente il file o un reference a quello) solo quando chiami flush.

Sono quasi certo che la libreria standard non metta nulla a disposizione di simile, forse Boost ma non so. Puoi comunque fartelo manualmente appunto

———
Tipo
C++:
template <class CharType>
class MyStreamWriter final {
public:
    MyStreamWriter(std::basic_ofstream<CharType>& s)
        : stream (s)
    { }
    void append(const std::basic_string<CharType>& string) {
        buffer.push_back(string);
    }
    void flush() {
        for (auto& s : buffer)
            stream << s;
        stream << std::flush;   
        buffer.resize(0);
    }
private:
    std::basic_ofstream<CharType>& stream;
    std::vector<std::basic_string<CharType>> buffer;
};
 
Ultima modifica:

vyzpup

Nuovo Utente
Ciao, scusami se rispondo ora. In ogni caso, hai ragione! Non avevo pensato minimamente a una soluzione del genere.
Grazie mille è esattamente quello che cercavo!
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando