I am running the following code:
#include
#include
#include
int main(){
FILE *fp;
if((fp=fopen(\"test.txt
Since I am on Windows, it takes \r\n as a new line character...
This assumption is wrong. The C standard treats carriage return and new line as two different things, as evidenced in C99 §5.2.1/3 (Character sets):
[...] In the basic execution character set, there shall be control characters representing alert, backspace, carriage return, and new-line. [...]
The fgets
function description is as follows, in C99 §7.19.7.2/2:
The fgets function reads at most one less than the number of characters specified by n from the stream pointed to by stream into the array pointed to by s. No additional characters are read after a new-line character (which is retained) or after end-of-file. A null character is written immediately after the last character read into the array.
Therefore, when encountering the string I am a boy\r\n
, a conforming implementation should read up to the \n
character. There is no possibly sane reason why the implementation should discard \r
based on the platform.
The behavior depends on the c library implementation and which mode you pass to fopen
. See this quote from the MSDN documentation on fopen
(fopen on MSDN):
b - Open in binary (untranslated) mode; translations involving carriage-return and linefeed characters are suppressed.
Means, if you use the Microsoft c library, and open your file omitting the 'b', the carriage return characters will be removed from the stream.
Since you're using mingw, your compiler probably links against the GNU c library which follows the POSIX standard. This is what the GNU documentation says about fopen
(fopen on gnu.org):
The character ‘b’ in opentype has a standard meaning; it requests a binary stream rather than a text stream. But this makes no difference in POSIX systems (including GNU systems).
Concluding: you're omitting the 'b' mode char, which opens your stream in text mode. You're on Windows but use a GNU c library which makes no difference between text and binary mode. This is why fgets
reads both carriage return and new line.