C++ String: What is the difference between '\n' and '\r\n'?
Q: What is the difference between '\n' and '\r\n'?
There are a few characters which can indicate a new line. The usual ones are these two:
- '\n' or '0x0A' (10 in decimal) -> This character is called "Line Feed" (LF).
- '\r' or '0x0D' (13 in decimal) -> This one is called "Carriage return" (CR).
Different Operating Systems handle newlines in a different way. Here is a short list of the most common ones:
- DOS and Windows
They expect a newline to be the combination of two characters, namely '\r\n' (or 13 followed by 10).
- Unix (and hence Linux as well)
Unix uses a single '\n' to indicate a new line.
Macs use a single '\r'.
This difference gives rise to a number of problems. For example, a file created under Unix (so with newlines as a single LF) will not open correctly under Window's Notepad. Any Windows program that expects newlines to be CRLF will not work correctly with these files.
To unify things a bit, so that writing portable C/C++ programs is possible, file streams have both a "translated" and an "untranslated" mode. If you open a file in translated mode, the runtime library will convert a '\n' to the appropriate newline character(s). If the following program is compiled under Unix, the file will contain a single LF to indicate the newline. If it's compiled under windows, it will contain a CRLF.
If you look at the generated file with a hex editor, you will see that the windows version has generated the following:
FILE *fp = fopen("testfile.txt", "w");
fprintf(fp, "Hello World\n");
So file streams are handled in a transparent way, provided of course that you only handle files compatible with your operating system. But many times you have to pass multi-line strings directly to some system functions.
H e l l o W o r l d CR LF
0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 0x0D 0x0A
In Windows you have to pass multi-line strings with '\r\n', otherwise the system functions don't recognize them correctly as multi-line. This is true e.g. for setting the text of Edit controls, Labels, Windows etc. Also, when you read multi-line text from a file that initially contains '\r\n' in translated mode, the string in memory will contain only a single '\n'. See for example the documentation on MSDN about 'fread()':
If you want to be able to read text files written on different operating systems, you have to open the file in binary (= untranslated) mode and check for the different newlines yourself.
Originally Posted by MSDN