I am running the following code:
#include<stdio.h>
#include<string.h>
#include<io.h>
int main(){
FILE *fp;
if((fp=fopen("test.txt","r"))==NULL){
printf("File can't be read\n");
exit(1);
}
char str[50];
fgets(str,50,fp);
printf("%s",str);
return 0;
}
text.txt contains: I am a boy\r\n
Since I am on Windows, it takes \r\n as a new line character and so if I read this from a file it should store "I am a boy\n\0"
in str
, but I get "I am a boy\r\n"
. I am using mingw compiler.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With