2010-03-26 19 views
15

esiste un modo per utilizzare automaticamente il carattere EOL corretto in base al sistema operativo utilizzato?Terminale portatile

Stavo pensando a qualcosa come std::eol?

So che è molto facile utilizzare le direttive del preprocessore ma è curioso sapere se è già disponibile.

Quello che mi interessa è che di solito ho alcuni messaggi nelle mie applicazioni che unisco più tardi in una singola stringa e voglio averli separati con un EOL. So che potrei usare std::stringstream << endl ma a volte sembra essere un overkill invece di un'appendice regolare.

risposta

11

std::endl è definito per non fare altro che scrivere '\n' nello stream e svuotarlo (§27.6.2.7). Flushing è definito per non fare nulla per uno stringstream, quindi ti rimane un bel modo di dire mystringstream << '\n'. L'implementazione della libreria standard sul tuo sistema operativo converte in modo appropriato \n, quindi non è la tua preoccupazione.

Così endl è già il massimo in termini di prestazioni e portabilità e l'unica altra cosa che si può desiderare è << '\n' se si sta tentando di scrivere in modo efficiente in un file (non in un stringing). Bene, << '\n' elimina anche l'inutile chiamata virtuale a stringbuf::flush. A meno che il profiling non mostri che la funzione vuota richiede tempo, non pensarci.

+0

Ho capito che l'uso di \ n è dappertutto perfettamente funzionante e il sistema operativo (leggi Windows) lo gestisce automaticamente per diventare \ r \ n quando scrivo alla console e ai file. È più che sufficiente per me a questo punto. – Andrew

+0

@Potatoswatter: forse quello che stavi indicando (supponendo che sia lo standard C++) è ora la sezione §27.7.3.8? – sturmer

+0

@sturmer Sì, questo è un riferimento a C++ 03 che era corrente al momento. I numeri cambiano, ma la sezione è denominata [lib.ostream.manip]. Ad ogni modo, non c'è proprio niente da vedere lì. Dice solo "Effects: Calls' os.put (os.widen ('\ n')) ', quindi' os.flush() '." – Potatoswatter

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 occuperà della EOL di conseguenza per i suoi standard.

+7

Quanto ... C di te :-) – paxdiablo

+1

Eheh sono uno di vecchia scuola XD –

+2

Ora hai dimenticato di chiudere il file. : P – GManNickG

10

Se si vuole scrivere un separatore di linea ad un flusso:

std::cout << '\n'; 

o

std::cout << "\n"; 

o

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

Se il flusso è la modalità testo e il sistema operativo utilizza nulla diverso da LF come separatore, sarà convertito.

Se si vuole scrivere un separatore di linea e lavare il flusso:

std::cout << std::endl; 

Se si dispone di uscita binaria-mode per qualsiasi motivo, e si vuole scrivere un'interruzione di linea specifico per la piattaforma, allora penso potrebbe essere necessario farlo indirettamente (scrivere '\n' in un flusso di testo e quindi esaminarlo in modalità binaria per vedere cosa ottieni). Forse c'è un modo per ottenere direttamente la sequenza di interruzioni di linea dall'implementazione, di cui non sono a conoscenza. Comunque, non è una grande idea: se stai scrivendo o leggendo un file in modalità binaria, dovrebbe essere in un formato che definisce le interruzioni di riga indipendentemente dal sistema operativo, o che non ha linee. Ecco cosa è la modalità binaria per.

1

Ebbene, lo STL ha std :: endl, che si può usare come

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

Si noti che oltre ad aggiungere una linea di fondo, std :: endl svuota anche il buffer, che può avere conseguenze indesiderate di prestazioni.

+1

Err ... non è STL, sono iostreams. –

+0

Sono d'accordo con BillyONeal. Inoltre, quando vuoi solo un ''\ n'', scrivi'' \ n'', non 'std :: endl'. Una volta ho visto un'accelerazione di un fattore di 8 dopo aver sostituito inutilmente 'std :: endl' di' '\ n''. – sbi

+0

Oh, non sapevo che quelle fossero entità separate. Avevo pensato che lo fossero perché condividono lo spazio dei nomi. Grazie per la correzione. – dimatura

1

I file, anche i file di testo, vengono spesso trasferiti tra le macchine, quindi "carattere di nuova riga os-specifico" è un ossimoro.

È pur vero che i sistemi operativi hanno voce in capitolo, in particolare un sistema operativo noto anche come Windows, anche se molti programmi Windows leggeranno correttamente i file \ n-spaced, anche se il controllo di modifica multilinea winapi non lo farebbe. Ti suggerisco di considerare due volte ciò che è giusto per te: non è necessariamente ciò che il tuo sistema operativo consiglia. Se i file devono essere memorizzati su supporti rimovibili, non utilizzare lo standard OS. Utilizza lo standard globale, 0xA.