C语言fgets按行读取文件,末尾的换行符问题
·
之前的博客提到了怎样对长度不确定且无法估计的文本文件进行按行读取的问题,这次我发现了一个每一行的末尾换行符处理的问题以及fgets的一个特性,这都是我之前没有注意到的地方。
1.每行末尾换行符的处理
首先,问题的导入在于我写的一个小程序。
1.我在一个文本文件中打字,然后想用fgets读取第一行的内容2.我想再读取之后对数组进行打印来体现出换行符的存在3.发现问题。
下面是文本文件的内容:
下面是控制台打印读取的内容。(我把数组初始化为’9’,为了视觉方便,每个字符两侧放上:)
可以看到读取结果显示每行末尾存在着两个换行符。并且,那个空格字符是哪来的??
1.1解释
1.为什么有两个换行符?
Windows系统下换行符是两个字符’\r’和’\n’,所以会换行两次
2.空格哪来的??
fgets会再读取结束后在输入流的末尾自动加上’\0’作为结束的标志,而打印’\0’字符就是一个空格。
1.2代码
下面是我写的代码,可以看一看,
#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’问题
我们通过实际操作来验证,下面是代码:
#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;
}
那么结果如何?
2.1运行结果
可以看到在我输入"afsv"之后fgets确实在末尾自动加上了’\0’,并且打印时体现为空格
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两个字符!!,这一个细节十分重要。图片展示:
可以看到缓冲区中存储着“ab\r\n",所以打印出这个结果并不奇怪。
更多推荐
所有评论(0)