以rb打开多行字符文件,输出时,多了换行

#include <stdio.h>
#include <stdlib.h>
#define N 100
int main(){
    FILE *fp;
    char str[N+1];
    if( (fp=fopen("F:\\clion c++\\code\\cmake-build-debug-coverage\\t1.txt","rb")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }

    while(fgets(str, N, fp) != NULL){
        printf("%s", str);
    }

    fclose(fp);
    return 0;
}

//文件中字符为
feqaer
asdfasdf
adsfa
//以rb文件,读取输出
feqaer

asdfasdf

adsfa
//以r打开文件
feqaer
asdfasdf
adsfa

为什么会出现这样的结果,\n符号在二进制文件中不是不会进行隐式转化嘛,为啥会多一个换行

Windows下换行符是\r\n连个字符,Linux下位\r
fgets会在输入流末尾自动加上’\0’

1.为什么有两个换行符?
Windows系统下换行符是两个字符’\r’和’\n’,所以会换行两次
2.空格哪来的??
fgets会再读取结束后在输入流的末尾自动加上’\0’作为结束的标志,而打印’\0’字符就是一个空格。

fgets函数原型为:char * fgets(char *restrict _Buf, int _MaxCount, FILE *restrict _File);但是fgets最多能接收的字符数量为(MaxCount - 1),这一点也要注意
fgets会吸收缓冲区中的回车符!!!并且这个回车符也会被解析为\r\n两个字符!!,

当用'r'方式读文件时,将文件里的\r\n读入为\n。
使用‘rb’,'wb'方式读写则不会发生上述转换