2011-07-28 16 views
8

¿Cómo se determina el entorno newline en C++? Google produce muchos resultados para C# y .NET, pero no vi ninguna forma de hacerlo para C++ que no sea CLI.Determinación del carácter Newline para el entorno Se está compilando un programa C++ en

Información adicional: Necesito escanear un const char* para el/los personaje (s).

Por "medio ambiente salto de línea" quiero decir \r\n en Windows, \n en Linux, y \r en Mac.

+3

¿Por qué es necesario generar la nueva línea "local"? Desearía que la gente dejara de contaminar el mundo con la impresión de que "\ r \ n" es una nueva línea en Windows. Casi todos los editores de texto individuales en Windows manejan "\ n" solo encontrar. ¡El único contraejemplo del que he oído hablar es el Bloc de notas! –

+0

Esta pregunta me hizo engendrar otra: http://stackoverflow.com/questions/6865398/inserting-endline-into-a-stringstream –

+0

@Andre, ¿quién dijo algo acerca de la salida? –

Respuesta

6

std::endl inserta una nueva línea apropiada para el sistema. Puede usar un ostringstream para determinar la secuencia de nueva línea como una cadena en tiempo de ejecución.

#include <sstream> 

int main() 
{ 
    std::ostringstream oss; 
    oss << std::endl; 
    std::string thisIsEnvironmentNewline = oss.str(); 
} 

EDITAR: * Ver comentarios a continuación sobre por qué esto probablemente no va a funcionar.


Si usted sabe que sus plataformas estarán limitados a Windows, Mac y Unix, entonces se puede utilizar macros compilador predefinidas (listed here) para determinar la secuencia de línea de fondo en tiempo de compilación:

#ifdef _WIN32 
    #define NEWLINE "\r\n" 
#elif defined macintosh // OS 9 
    #define NEWLINE "\r" 
#else 
    #define NEWLINE "\n" // Mac OS X uses \n 
#endif 

La mayoría de las plataformas que no son de Windows ni de Apple son algún tipo de variante de Unix que usa \n, por lo que las macros anteriores deberían funcionar en muchas plataformas. Por desgracia, no conozco ninguna forma portátil de determinar la secuencia final en el momento de la compilación para todas las plataformas posibles.

+0

¿Es esta la única manera de hacerlo? Preferiría hacerlo en tiempo de compilación. –

+0

@Seth: ¿por qué necesita saber el tipo de salto de línea en tiempo de compilación? –

+1

@Remy porque no requiere computación en tiempo de ejecución :) Sin embargo, probablemente tenga que conformarme con esto. –

1

Generalmente con un #define. Pero, para aplicaciones simples, abrir un archivo en "modo de texto" le dará lo que necesita.

4

Para texto formateado IO en C++ (y C), el nuevo carácter de línea es siempre '\n'. Si desea conocer la representación binaria de una nueva línea para una plataforma y un modo de archivo determinados, abra un archivo en el modo deseado (por ejemplo, texto o binario, UTF-8, UTF-16, MCBS, etc.), escriba '\n', ciérrelo, vuélvalo a abrir en binario, lea todo el archivo y descubra cuál es la codificación binaria real de '\n'. También debe tener en cuenta el carácter end-of-file también.

+0

Esto funciona para sistemas con archivos orientados a flujo (como Unix, DOS y Windows), pero no para archivos orientados a registros (como en VMS). Para algunos sistemas, la indicación de final de línea no se almacena como una secuencia de caracteres en absoluto. –

+0

@Rob, claro, ¿pero quién usa VMS más? :) (j/k) – MSN

+0

Más en serio, ¿la pregunta tiene sentido en VMS? – MSalters

Cuestiones relacionadas