C语言fgets按行读取文件,末尾的换行符问题

以前的博客提到了怎样对长度不肯定且没法估计的文本文件进行按行读取的问题,此次我发现了一个每一行的末尾换行符处理的问题以及fgets的一个特性,这都是我以前没有注意到的地方。web

1.每行末尾换行符的处理

首先,问题的导入在于我写的一个小程序。
1.我在一个文本文件中打字,而后想用fgets读取第一行的内容2.我想再读取以后对数组进行打印来体现出换行符的存在3.发现问题。
下面是文本文件的内容:
infooftxt
下面是控制台打印读取的内容。(我把数组初始化为’9’,为了视觉方便,每一个字符两侧放上:)
p2
能够看到读取结果显示每行末尾存在着两个换行符。而且,那个空格字符是哪来的??小程序

1.1解释

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

1.2代码

下面是我写的代码,能够看一看,svg

#include <stdio.h>
#include <stdlib.h>

#define filepath "e:info.txt"
#define MAXLEN 100

int main(void) {
    
    FILE *fp = fopen(filepath, "r");
    if (!fp) {printf("file open error!\n"); system("pause"); exit(0);}

    char target[16]; for (int i = 0; i < 16; ++i) target[i] = '9';
    fgets(target, 16, fp);

    for (int i = 0; i < 16; ++i)
        printf(":%c:\n", target[i]);

    system("pause");
    fclose(fp);
    return 0;

}

那么fgets真的会在流自动末尾加上’\0’吗?函数

2.fgets末尾’\0’问题

咱们经过实际操做来验证,下面是代码:spa

#include <stdio.h>
#include <stdlib.h>

#define filepath "e:info.txt"
#define MAXLEN 100

int main(void) {
    
    
    char a[10];
    for (int i = 0; i < 10; ++i)
        a[i] = '1';
    
    fgets(a, 5, stdin);

    for (int i = 0; i < 10; ++i)
        printf(":%c:\n", a[i]);

    system("pause");


    return 0;

}

那么结果如何?rest

2.1运行结果

p3
能够看到在我输入"afsv"以后fgets确实在末尾自动加上了’\0’,而且打印时体现为空格code

3.总结

  • Windows下换行符是\r\n连个字符,Linux下位\r
  • fgets会在输入流末尾自动加上’\0’
  • fgets函数原型为:char * fgets(char *restrict _Buf, int _MaxCount, FILE *restrict _File);可是fgets最多能接收的字符数量为(MaxCount - 1),这一点也要注意
  • fgets会吸取缓冲区中的回车符!!!而且这个回车符也会被解析为\r\n两个字符!!,这一个细节十分重要。图片展现:
    111 能够看到缓冲区中存储着“ab\r\n",因此打印出这个结果并不奇怪。