Portatile di fine linea

c’è un modo per utilizzare automaticamente corretto EOL carattere a seconda del sistema operativo utilizzato?

Stavo pensando a qualcosa di simile std::eol?

So che è molto facile da usare le direttive del preprocessore, ma curioso di sapere se è già disponibile.

Quello che mi interessa è che di solito ho alcuni messaggi nel mio applicazioni che mi combinano più tardi in un’unica stringa e voglio averli separati con un EOL. So che potrei usare std::stringstream << endl, ma sembra essere un eccessivo a volte, invece di un normale append.

InformationsquelleAutor Andrew | 2010-03-26



5 Replies
  1. 13

    std::endl è definito per non fare niente, oltre che a scrivere '\n' il flusso e lavare (§27.6.2.7). Flushing è definito a non fare nulla per un stringstream, per cui si è lasciato con un bel modo di dire mystringstream << '\n'. La libreria standard di implementazione del sistema converte \n in modo appropriato, in modo che non è la vostra preoccupazione.

    Così endl è già il massimo in termini di prestazioni e portabilità, e l’unica cosa che si possa desiderare << '\n' se si sta cercando di scrivere in modo efficiente in un file (non un stringstream). Beh, << '\n' anche di eliminare l’inutile virtuale chiamata a stringbuf::flush. A meno di profilo mostra che la funzione vuota chiamata a prendere tempo, non ci pensare.

    • Ho pensato che l’utilizzo di ‘\n ovunque è totalmente bene e OS (leggi Windows) gestisce automaticamente a diventare \r\n quando scrivo per console e per i file. È più che sufficiente per me a questo punto.
    • forse quello che ti puntano a (supponendo che sia il C++ standard) è ora la sezione §27.7.3.8?
    • Sì, che è un riferimento al C++03 che era in vigore al momento. I numeri cambiano, ma la sezione è denominata [lib.ostream.manip]. Comunque, non c’è niente da vedere qui. Dice solo “Effetti: Chiamate os.put(os.widen(’\n’) ), quindi os.flush().”
    • Vorrei sottolineare che filo non è inutile. Se sei il debug utilizzando cout dichiarazioni, è meglio essere l’utilizzo di endl, o non siete garantiti per l’istruzione di stampa quando ci si aspetta di essere stampato. Lo stesso vale per il multithreading uscita della console (anche se la causa è un casino anche con il endl)
    • Questa risposta è pensato per essere letto nel contesto. Questo flusso non è cout. Il Multithreading richiede un mutex lock, vampate di calore potrebbe sembrare per aiutare a ridurre i sintomi di una condizione di competizione, ma è una non-soluzione.
  2. 11

    Se si desidera scrivere un separatore di riga di un flusso:

    std::cout << '\n';

    o

    std::cout << "\n";

    o

    std::cout << "whatever you were going to say anyway\n";

    Se il flusso è in modalità di testo, e il sistema operativo utilizza qualcosa di diverso LF come separatore, sarà convertito.

    Se si desidera scrivere un separatore di riga e a filo il flusso:

    std::cout << std::endl;

    Se si dispone di binario in modalità di uscita per qualsiasi motivo, e si desidera creare una piattaforma specifica interruzione di riga, quindi penso che si potrebbe avere a che fare indirettamente (scrivere '\n' in un flusso di testo e quindi esaminare in modalità binaria per vedere di cosa si tratta). Forse c’è qualche modo per ottenere direttamente la sequenza di interruzione di riga dall’attuazione, che io non sono a conoscenza di. Non è una grande idea, comunque: se la scrittura o la lettura di un file in modalità binaria, allora si dovrebbe essere in un formato che definisce le interruzioni di riga indipendentemente dal sistema operativo, o che non hanno linee a tutti. Che è quello che la modalità binaria è per.

  3. 2

    Basta aprire un file in modalità testo

    FILE *fp = fopen( "your_file.txt", "w+t" );

    e poi

    fprintf( fp, "some string and integer %d\n", i );
    fclose(fp);

    e il sistema operativo si prenderà cura di EOL, di conseguenza, per i suoi standard.

    • Ma quanto C … di te 🙂
    • Eheh io sono vecchia scuola, uno XD
    • Ora hai dimenticato di chiudere il file. 😛
    • Si prega di non fopen() nel codice di produzione, per motivi di sicurezza eccezione. Utilizzare STL RAII equivalenti.
    • Suvvia, era solo un esempio, si aspetta di avere un file di nome “your_file.txt” in un ambiente di produzione troppo?
    • È facile vedere che il nome del file deve adattato dal tuo esempio. E ‘ quasi impossibile vedere che uno non dovrebbe usare il C std lib per trattare con i file.
    • Non vedo come il sistema operativo si prenderà cura di EOL. In questo esempio l’EOL carattere \n, che il sistema operativo non dovrebbe cambiare.

  4. 1

    Bene, il STL ha std::endl, che è possibile utilizzare come

    std::cout << "Hi five!" << std::endl;

    Nota che oltre ad aggiungere un capolinea, std::endl anche svuota il buffer, che possono avere problemi di prestazioni conseguenze.

    • Err… non STL, che iostreams.
    • Sono d’accordo con BillyONeal. Inoltre, quando si desidera solo un '\n', basta scrivere '\n', non std::endl. Una volta ho visto un aumento di velocità di un fattore 8 dopo la sostituzione inutile std::endl da '\n'.
    • Oh, non sapevo che quelle sono due entità separate. Vorrei solo supporre che essi, in quanto condividono lo spazio dei nomi. Grazie per la correzione.
  5. 1

    File, anche i file di testo, sono spesso trasferiti tra le macchine, in modo da “specifiche del sistema operativo carattere di nuova riga” è un ossimoro.

    È pur vero che i sistemi operativi hanno un dire su tale materia, in particolare sistemi operativi uno aka Windows, anche se molti programmi windows, leggere \n-distanziati correttamente i file, anche se il winapi multiline controllo di modifica, non sarebbe. Io suggerisco di considerare due volte che cosa è giusto per voi: non è necessariamente quello che il sistema operativo consiglia. Se i tuoi file sono sempre di essere memorizzati su supporti rimovibili, non usare OS standard. Utilizzare standard globale, 0xA.

Lascia un commento