How does one determine the environment newline1 in C++? Google yields many results for C# and .NET but I didn't see any way to do it for non-CLI C++.
Additional info: I need to scan a const char*
for the character(s).
1By "environment newline" I mean \r\n
on Windows, \n
on Linux, and \r
on Mac.
std::endl
inserts a newline appropriate for the system. You can use a ostringstream
to determine the newline sequence as a string at runtime.
#include <sstream>
int main()
{
std::ostringstream oss;
oss << std::endl;
std::string thisIsEnvironmentNewline = oss.str();
}
EDIT: * See comments below on why this probably won't work.
If you know that your platforms will be limited to Windows, Mac, and Unix, then you can use predefined compiler macros (listed here) to determine the endline sequence at compile-time:
#ifdef _WIN32
#define NEWLINE "\r\n"
#elif defined macintosh // OS 9
#define NEWLINE "\r"
#else
#define NEWLINE "\n" // Mac OS X uses \n
#endif
Most non-Windows and non-Apple platforms are some kind of Unix variant that uses \n
, so the above macros should work on many platforms. Alas, I don't know of any portable way to determine the endline sequence at compile time for all possible platforms.
For formatted text IO in C++ (and C), the new line character is always '\n'
. If you want to know the binary representation of a new line for a given platform and file mode, open a file in the desired mode (e.g., text or binary, UTF-8, UTF-16, MCBS, etc.), write out '\n'
, close it, reopen it in binary, read in the entire file, and figure out what the actual binary encoding of '\n'
. You may also have to account for the end-of-file
character as well.
Generally with a #define. But, for simple applications, opening a file in "text mode" will give you what you need.